一个可能的解决方案:
withUnsafeMutablePointer(&myVarOfStructProduct.name) {
strlcpy(UnsafeMutablePointer($0), productName, UInt(sizeofValue(myVarOfStructProduct.name)))
}
在块内部,$0 是指向元组的(可变)指针。这个指针是
如预期的那样转换为UnsafeMutablePointer<Int8>
BSD library function strlcpy().
它还使用了 Swift 字符串 productName 自动
到UnsafePointer<UInt8>
如String value to UnsafePointer<UInt8> function parameter behavior 中所述。正如 cmets 中提到的那样
线程,这是通过创建一个临时的UInt8 数组(或序列?)来完成的。
所以或者你可以显式枚举 UTF-8 字节并将它们放入
进入目的地:
withUnsafeMutablePointer(&myVarOfStructProduct.name) {
tuplePtr -> Void in
var uint8Ptr = UnsafeMutablePointer<UInt8>(tuplePtr)
let size = sizeofValue(myVarOfStructProduct.name)
var idx = 0
if size == 0 { return } // C array has zero length.
for u in productName.utf8 {
if idx == size - 1 { break }
uint8Ptr[idx++] = u
}
uint8Ptr[idx] = 0 // NUL-terminate the C string in the array.
}
另一种可能的解决方案(使用中间 NSData 对象):
withUnsafeMutablePointer(&myVarOfStructProduct.name) {
tuplePtr -> Void in
let tmp = productName + String(UnicodeScalar(0)) // Add NUL-termination
let data = tmp.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
data.getBytes(tuplePtr, length: sizeofValue(myVarOfStructProduct.name))
}
Swift 3 更新:
withUnsafeMutablePointer(to: &myVarOfStructProduct.name) {
$0.withMemoryRebound(to: Int8.self, capacity: MemoryLayout.size(ofValue: myVarOfStructProduct.name)) {
_ = strlcpy($0, productName, MemoryLayout.size(ofValue: myVarOfStructProduct.name))
}
}