我有一个Swift程序,可以与C库互操作。这个C库返回一个内部带有char[]
数组的结构,如下所示:
struct record
{
char name[8];
};
该定义已正确导入到Swift中。但是,该字段被解释为8个
Int8
元素(键入(Int8, Int8, Int8, Int8, Int8, Int8, Int8, Int8)
)的元组,我不知道如何使用Swift将其转换为String
。没有
String
初始化程序接受Int8
元组,并且似乎不可能获得指向元组第一个元素的指针(因为类型可以是异构的,这并不奇怪)。现在,我最好的主意是创建一个微型C函数,该函数接受指向结构本身的指针,并将
name
作为char*
指针而不是数组返回,然后继续。但是,那里有纯粹的Swift方法吗?
最佳答案
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。 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序列。关于arrays - 将C char数组转换为String,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51533440/