为什么不能将Swift Data自由转换为UnsafePointer?

时间:2019-06-18 15:33:11

标签: swift

我正在使用一个占用大量字节数组的c库。我可以直接传入Strings和UInt8数组,它们将按预期工作。如果即时通讯似乎使用了Data变量,则必须使用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))
}

当您的函数使用这些arg中的3或4个时,您将得到笨拙的代码。

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

1 个答案:

答案 0 :(得分:0)

无法保证数据是连续的(例如,它可以是dispatch_data周围的包装器)。调用.withUnsafeBytes既可确保接收到的指针指向连续的字节,又可确保整个块的数据继续存在。如果您只有UnsafePointer,则可能会在指针超出范围之前释放基础数据(尤其是如果指针存储或传递到任何地方),或者会遇到修改其后备存储的写时复制事件。