Skip to main content
 首页 » 操作系统

casting之NSData(字节:length:) convert [Byte] to UnsafePointer in Swift

2024年01月01日43jackei

在 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>可以采用其中任何一个,对类型没有任何限制,因此您需要阅读函数的文档以了解它期望/将返回什么。