在 Swift 中处理原始数据时,我遇到了一些我不明白的事情。
NSData 有一个构造函数:
init(bytes: UnsafePointer<Void>, length: Int)
第一个 bytes 参数显然是 UnsafePointer 类型。
但是,如果我将 [Byte] 对象传递给此构造函数,编译器不仅不会报错,而且工作正常。
但是,如果我尝试将 [Byte] 转换为 UnsafePointer,则会失败。
这是如何工作的?
例如(您可以在 Playgrounds 中尝试):
let buffer: [Byte] = [0x00, 0xff]
let data = NSData(bytes: buffer, length: buffer.count) // no error
data.description
var pointer: UnsafePointer<Void>
// comment this line to avoid compiler error
pointer = buffer // error
我知道我能做到
UnsafePointer<Void>(buffer)
但我的问题是,NSData 构造函数隐式做了什么,我不必那样做。
请您参考如下方法:
当你调用需要它们的 C 函数时,Swift 将它自己的类型映射到 C 指针。 Apple 有一些关于此交互的文档:Interacting with C APIs .
简而言之,当您调用一个接受 UnsafePointer<Type> 的函数时, 它可以接受 nil , 一个 inout该类型的变量,该类型的数组(即 [Type] ,您正在使用的内容)或通用 Swift 指针类型之一。函数取 UnsafePointer<Void>可以采用其中任何一个,对类型没有任何限制,因此您需要阅读函数的文档以了解它期望/将返回什么。
