在Swift中使用原始数据我遇到了一些我不理解的东西 NSData 有一个构造函数:
init(bytes: UnsafePointer<Void>, length: Int)
其中第一个字节参数明显为 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构造函数隐式执行什么操作,我不必这样做。
答案 0 :(得分:3)
当你调用需要它们的C函数时,Swift将自己的类型映射到C指针。 Apple提供了有关此互动的一些文档:Interacting with C APIs。
简而言之,当您调用一个UnsafePointer<Type>
的函数时,它可以接受nil
,该类型的inout
变量,该类型的数组(即, [Type]
,你正在使用什么),或者一般的Swift指针类型。使用UnsafePointer<Void>
的函数可以采用任何一种函数,对类型没有任何约束,因此您需要阅读函数的文档以查看它期望/将返回的内容。