为什么可以';Swift数据不能自由转换为非安全指针吗?

为什么可以';Swift数据不能自由转换为非安全指针吗?,swift,Swift,我正在使用一个接受大量字节数组的c库。我可以直接传入字符串和UInt8数组,它们将按预期工作。如果我使用一个数据变量,尽管我似乎必须使用withUnsafeBytes来获取内存 let string = "message" let array = Array(string.utf8) let bytes = Data(string.utf8) CALL_C_FUNC(string, Int32(string.count)) //works CALL_C_FUNC(array, Int32(ar

我正在使用一个接受大量字节数组的c库。我可以直接传入字符串和UInt8数组,它们将按预期工作。如果我使用一个数据变量,尽管我似乎必须使用withUnsafeBytes来获取内存

let string = "message"
let array = Array(string.utf8)
let bytes = Data(string.utf8)

CALL_C_FUNC(string, Int32(string.count)) //works
CALL_C_FUNC(array, Int32(array.count)) //works
CALL_C_FUNC(bytes, Int32(bytes.count)) //does not work

//instead use:
bytes.withUnsafeBytes { (pBytes: UnsafePointer<UInt8>) in
    CALL_C_FUNC(pBytes, Int32(bytes.count))
}
let string=“message”
让数组=数组(string.utf8)
让字节=数据(string.utf8)
调用_C_FUNC(string,Int32(string.count))//works
调用_C_FUNC(array,Int32(array.count))//works
调用_C_FUNC(bytes,Int32(bytes.count))//不起作用
//而是使用:
bytes.withUnsafeBytes{(pBytes:UnsafePointer)位于
调用_C_FUNC(pBytes,Int32(bytes.count))
}
当您的函数使用3或4个参数时,您最终会得到笨拙的代码


这个答案()表示数据通常是Swift中处理字节数组的首选方式。如果是这样的话,为什么与其他类型的c库相比,将它们与c库一起使用会如此复杂?

没有保证数据是连续的(例如,它可以是
调度\u数据的包装器)。调用
.withUnsafeBytes
既可以确保接收到的指针指向连续字节,也可以确保整个块的数据继续存在。如果您只有一个UnsafePointer,则基础数据可能会在指针超出作用域之前释放(特别是在指针存储或传递到任何位置时),或者可能会遇到修改其备份存储的写时拷贝事件。

不保证数据是连续的(例如,它可以是
dispatch\u data
的包装器)。调用
.withUnsafeBytes
既可以确保接收的指针指向连续字节,也可以确保整个块中的数据继续存在。如果您只有一个UnsafePointer,则可能会在指针超出范围之前释放底层数据(特别是当指针存储或传递到任何位置时),或者可能会遇到修改其备份存储的写时拷贝事件。

因为,
数据
现在实际上保证始终具有连续存储(并符合新的
连续字节
协议)。抱歉,我花了这么长时间才将其标记为答案。这个答案让我很惊讶,但解释了很多关于该类的历史背景和设计。从文档中看肯定不明显。将来可能会出现更好的类型转换,因为它符合
ContiguousBytes
。因为,
数据
是实际的ly现在保证始终具有连续存储(并符合新的
ContiguousBytes
协议)。抱歉,我花了这么长时间才将其标记为答案。这个答案让我很惊讶,但解释了很多关于该类的历史背景和设计。从文档中看肯定不明显。也许将来会出现更好的类型转换,因为它符合
ContiguousBytes