我有一个与C库进行互操作的swift程序。此C库返回一个包含char[]数组的结构,如下所示:

struct record
{
    char name[8];
};

定义已正确导入到swift中。但是,该字段被解释为8个Int8元素(键入(Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8))的元组,我不知道如何用swift将其转换为String
没有接受String元组的初始化器,而且似乎不可能获得指向元组第一个元素的指针(因为类型可以是异构的,这并不令人惊讶)。
现在,我的最佳想法是创建一个小的C函数,它接受指向结构本身的指针,并返回Int8作为name指针而不是数组,然后继续执行。
然而,有没有一种纯粹迅速的方法来做到这一点?

最佳答案

c数组char name[8]作为元组导入到swift:

(Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8)

name的地址与name[0]的地址相同,并且
swift保留从c导入的结构的内存布局,如
confirmed by Apple engineer Joe Groff:
…您可以保留C中定义的结构并将其导入swift。斯威夫特将尊重C的布局。
因此,我们可以传递record.name的地址,
转换为UInt8指针,
字符串初始值设定项:
var record = someFunctionReturningAStructRecord()

// Swift 2:
let name = withUnsafePointer(&record.name) {
    String.fromCString(UnsafePointer($0))!
}

// Swift 3:
let name = withUnsafePointer(to: &record.name) {
    $0.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout.size(ofValue: record.name)) {
        String(cString: $0)
    }
}

注意:假设name[]中的字节是有效的以nul结尾的utf-8序列。

09-07 14:53