在Swift中,当调用C函数时,当作为参数传递时,Swift字符串会自动强制转换为CString。但是,填写C结构或全局变量时,我没有得到相同的行为。
strlen(swiftString) //Works!
CGlobalStruct.stringPtr = swiftString //Doesn't work!
首先,当它们都是“const * char”时,它们为什么表现不同。第二,填写C Structs最简洁的方法是什么?
答案 0 :(得分:4)
Swift String
可以作为参数传递给函数
一个UnsafePointer<Int8>
参数。编译器生成Swift字符串的临时表示
作为NUL终止的char
序列并传递指针
那个C String到函数。表示和指针仅在函数调用期间有效。这就是在
strlen(swiftString)
当分配全局C字符串指针时,你必须采取 这个指针的生命周期考虑在内。一种可能性是
let swiftString = "Hello world"
swiftString.withCString {
CGlobalStruct.stringPtr = $0
// Pointer valid inside this closure ...
}
// Pointer not valid anymore ...
将指向C字符串表示的指针传递给闭包。 在执行闭包期间,此指针(仅)有效。
对于更长寿命的使用,你可以在内存中分配一个C字符串, 但是你最终有责任释放那些记忆:
guard let cStringPtr = strdup(swiftString) else {
fatalError("strdup failed")
}
CGlobalStruct.stringPtr = UnsafePointer(cStringPtr)
// ...
free(cStringPtr)