我正在使用一个占用大量字节数组的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库一起使用它们为什么这么复杂?
答案 0 :(得分:0)
无法保证数据是连续的(例如,它可以是dispatch_data
周围的包装器)。调用.withUnsafeBytes
既可确保接收到的指针指向连续的字节,又可确保整个块的数据继续存在。如果您只有UnsafePointer,则可能会在指针超出范围之前释放基础数据(尤其是如果指针存储或传递到任何地方),或者会遇到修改其后备存储的写时复制事件。>