String 将字符串转换为int8数组

String 将字符串转换为int8数组,string,swift,String,Swift,我有一个C结构(旧库,等等),它包含一个C字符串,现在我需要将CFString和Swift字符串转换成这个C字符串。差不多 struct Product{ char name[50]; char code[20]; } 所以我试着把它指定为 productName.getCString(&myVarOfStructProduct.name, maxLength: 50, encoding: NSUTF8StringEncoding) 但编译器给了我以下错误:无法将类型(i

我有一个C结构(旧库,等等),它包含一个C字符串,现在我需要将CFString和Swift字符串转换成这个C字符串。差不多

struct Product{
   char name[50];
   char code[20];
}
所以我试着把它指定为

productName.getCString(&myVarOfStructProduct.name, maxLength: 50, encoding: NSUTF8StringEncoding)
但编译器给了我以下错误:无法将类型(int8、int8、int8…)转换为[CChar]。

可能的解决方案:

withUnsafeMutablePointer(&myVarOfStructProduct.name) {
    strlcpy(UnsafeMutablePointer($0), productName, UInt(sizeofValue(myVarOfStructProduct.name)))
}
在块中,
$0
是指向元组的(可变)指针。这个指针是 已转换为

它还使用了一个事实,即Swift字符串
productName
是自动生成的 到
UnsafePointer
如中所述。如该报告评论中所述 线程,这是通过创建一个临时的
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.
}

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))
    }
}

这很有趣,因为我刚刚喝了一杯。
withUnsafeMutablePointer(to: &myVarOfStructProduct.name) {
    $0.withMemoryRebound(to: Int8.self, capacity: MemoryLayout.size(ofValue: myVarOfStructProduct.name)) {
        _ = strlcpy($0, productName, MemoryLayout.size(ofValue: myVarOfStructProduct.name))
    }
}