前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UnsafePoint 指针

UnsafePoint 指针

作者头像
大话swift
发布2019-07-03 17:03:29
1.8K0
发布2019-07-03 17:03:29
举报
文章被收录于专栏:大话swift
C是所有计算机语言永恒的话题,这个对于swift来说也不例外,虽然指针在swift中是尽量避免的,但是依然逃不出,虽然不能避免但是可以被降级对待---所有的指针在swift被冠以unsfae之名,下面是几个常用的

1 UnsafePoint

2 UnsafeMutablePoint

3 UnsafeRawPoint

4 UnsageMutableRawPoint

在说之前我们先看看指针

代码语言:javascript
复制
func printUnsafeAddress<T>(atAddress p:UnsafePointer<T>){
    print(p.pointee)
}

我们来看看String的打印

代码语言:javascript
复制
var abc = "abcdABCD"
printUnsafeAddress(atAddress: &abc)

看到需要一个&代表字符串的引用

代码语言:javascript
复制
let  charArray = ["A", "B","1","2345"]
var intValues = charArray.compactMap { (value:String) -> Int? in
    return Int(value)
}
printUnsafeAddress(atAddress: intValues)

从上看出数组名是对应的指针在swift中也是成立的,同时对于变量天际&即得到一个UnsafePointer

有了初体验之后我们看看怎么初始化一个指针数据

1 UnsafePointer的初始化

代码语言:javascript
复制
var cc  = 12
let unsafe = UnsafePointer(&cc)
printUnsafeAddress(atAddress: unsafe)

2 UnsafeMutablePointer初始化

此处我们将String转化为指针数据

代码语言:javascript
复制
let data = str.data(using: String.Encoding.utf8)!
let dataLength = data.count * MemoryLayout<UInt8>.stride
let ptr =  UnsafeMutablePointer<UInt8>.allocate(capacity: data.count)

data.copyBytes(to: ptr, count: data.count)
defer{
    ptr.deallocate()
}

printUnsafeAddress(atAddress: ptr)

3 UnsafeRawPointer初始化

代码语言:javascript
复制
 let rawPointer = UnsafeRawPointer(ptr)
let pointer = rawPointer.assumingMemoryBound(to: CChar.self)
String.init(cString: pointer)

‍4 数组转化UnsafeRawPointer取值

代码语言:javascript
复制

let cArr = NSArray(object: str)
let cObj: UnsafeRawPointer =  CFArrayGetValueAtIndex(cArr, 0)

5 强转数据

代码语言:javascript
复制
let s = unsafeBitCast(cObj, to: CFString.self)

String.init(s)

6 结合实践进行String UnsafePointer转化

代码语言:javascript
复制
extension String{
    
    // String 转化为 const char *
    func convertCString(usig encoding: String.Encoding = .utf8)->UnsafePointer<Int8>{
        let data = self.data(using: encoding)!
        let bytes = UnsafeMutablePointer<UInt8>.allocate(capacity: data.count)
        defer {
            bytes.deallocate()
        }
        data.copyBytes(to: bytes, count: data.count)
        return UnsafeRawPointer(bytes).assumingMemoryBound(to: CChar.self)
    }
}

extension UnsafeMutablePointer {
    
    // 用于C字符串对比
    public func equalUnsafePointer<T> (other:UnsafePointer<T>) ->Bool{
        let cStringValue = unsafeDowncast(self.pointee as AnyObject, to: CFString.self)
        let cOtherStringValue = unsafeDowncast(other.pointee as AnyObject, to: CFString.self)
        return cStringValue == cOtherStringValue
    }
    
    public func toString()->String   {
       let cBuffer =  UnsafeRawPointer.init(self).assumingMemoryBound(to: CChar.self)
     return   String.init(cString: cBuffer)

    }
}
extension UnsafePointer{
    public func  toValue()->String{
   let unsafeMutablePointer =  UnsafeMutablePointer(mutating: self)
        let cBuffer = UnsafeMutableRawPointer.init(unsafeMutablePointer).assumingMemoryBound(to: CChar.self)
        return String.init(cString: cBuffer)
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档