【问题标题】:How does NSData(bytes:length:) convert [Byte] to UnsafePointer<Void> in Swift?NSData(bytes:length:) 如何在 Swift 中将 [Byte] 转换为 UnsafePointer<Void>?
【发布时间】:2014-09-25 18:39:05
【问题描述】:

在 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 构造函数隐含地做了什么,我不必这样做。

【问题讨论】:

    标签: casting swift nsdata swift-playground


    【解决方案1】:

    当您调用需要它们的 C 函数时,Swift 会将其自己的类型映射到 C 指针。 Apple 有一些关于这种交互的文档:Interacting with C APIs。

    简而言之,当您调用一个接受 UnsafePointer&lt;Type&gt; 的函数时,它可以接受 nil、该类型的 inout 变量、该类型的数组(即 [Type],您're using) 或通用 Swift 指针类型之一。采用 UnsafePointer&lt;Void&gt; 的函数可以采用其中任何一个,而对类型完全没有限制,因此您需要阅读函数的文档以了解它期望/将返回的内容。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多