Swift字符串文字赋值给C变量

时间:2016-10-19 03:07:19

标签: swift

在Swift中,当调用C函数时,当作为参数传递时,Swift字符串会自动强制转换为CString。但是,填写C结构或全局变量时,我没有得到相同的行为。

strlen(swiftString)                     //Works!
CGlobalStruct.stringPtr = swiftString   //Doesn't work!

首先,当它们都是“const * char”时,它们为什么表现不同。第二,填写C Structs最简洁的方法是什么?

1 个答案:

答案 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)