NSData(bytes:length :)如何在Swift中将[Byte]转换为UnsafePointer <void>?</void>

时间:2014-09-25 18:39:06

标签: casting swift nsdata swift-playground

在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构造函数隐式执行什么操作,我不必这样做。

1 个答案:

答案 0 :(得分:3)

当你调用需要它们的C函数时,Swift将自己的类型映射到C指针。 Apple提供了有关此互动的一些文档:Interacting with C APIs

简而言之,当您调用一个UnsafePointer<Type>的函数时,它可以接受nil,该类型的inout变量,该类型的数组(即, [Type],你正在使用什么),或者一般的Swift指针类型。使用UnsafePointer<Void>的函数可以采用任何一种函数,对类型没有任何约束,因此您需要阅读函数的文档以查看它期望/将返回的内容。