无法为类型 Unsafepointer Swift 3.0 转换初始化变量

Posted

技术标签:

【中文标题】无法为类型 Unsafepointer Swift 3.0 转换初始化变量【英文标题】:Cannot Initialise Variable for type Unsafepointer Swift 3.0 conversion 【发布时间】:2017-09-12 06:34:55 【问题描述】:

您好,我正在将现有的 swift 2.0 代码转换为 swift 3.0,但在转换时遇到错误:

无法使用“(UnsafeRawPointer)”类型的参数列表调用“UnsafePointer”类型的初始化程序

这是我的代码:

extension Data 

  var hexString : String 
    let buf = UnsafePointer<UInt8>(bytes) // here is the error
    let charA = UInt8(UnicodeScalar("a").value)
    let char0 = UInt8(UnicodeScalar("0").value)

    func itoh(_ i: UInt8) -> UInt8 
        return (i > 9) ? (charA + i - 10) : (char0 + i)
    

    let p = UnsafeMutablePointer<UInt8>.allocate(capacity: count * 2)

    for i in 0..<count 
        p[i*2] = itoh((buf[i] >> 4) & 0xF)
        p[i*2+1] = itoh(buf[i] & 0xF)
    

    return NSString(bytesNoCopy: p, length: count*2, encoding: String.Encoding.utf8.rawValue, freeWhenDone: true)! as String
 

【问题讨论】:

为什么不简单地var hexString : String return self.map String(format:"%02x", $0) .joined() 这个字符串用于各种模式所以 对答案有任何反馈吗? 感谢您的回答。 如果答案有帮助,那么您可以通过单击复选标记接受它。 【参考方案1】:

在 Swift 3 中,您必须使用 withUnsafeBytes() 来访问 Data 值的原始字节。在你的情况下:

withUnsafeBytes  (buf: UnsafePointer<UInt8>) in
    for i in 0..<count 
        p[i*2] = itoh((buf[i] >> 4) & 0xF)
        p[i*2+1] = itoh(buf[i] & 0xF)
    

或者,使用Data 是字节集合的事实:

for (i, byte) in self.enumerated() 
    p[i*2] = itoh((byte >> 4) & 0xF)
    p[i*2+1] = itoh(byte & 0xF)

请注意,您的代码中还有另一个问题:

NSString(..., freeWhenDone: true)

使用free()来释放内存,也就是说必须是 分配给malloc()

其他(较短,但可能效率较低)的创建方法 Data 值的十六进制表示可以在以下位置找到 How to convert Data to hex string in swift.

【讨论】:

以上是关于无法为类型 Unsafepointer Swift 3.0 转换初始化变量的主要内容,如果未能解决你的问题,请参考以下文章

UnsafePointer 不再适用于 swift 3

将NSUUID转换为UnsafePointer

在 Swift 中使用 C 字符串,或者:如何将 UnsafePointer<CChar> 转换为 CString

Swift 3 - 使用 UnsafePointer<CFDictionary>?

Swift中对C语言接口缓存的使用以及数组字符串转为指针类型的方法

Swift 到 C 的桥接:字符串到 UnsafePointer<Int8>?是否自动桥接?