我正在使用第三方 c API 我正在尝试使用一个简单的字符串调用其中一个函数。像这样:
some_c_func("aString");
我遇到构建错误:
Type 'UnsafeMutablePointer<char_t>' does not conform to protocol 'StringLiteralConvertible'
我看到了一些关于在 String 或类似转换上使用 utf8 的建议,这些建议已经接近尾声,但出现以下错误:
some_c_func("aString".cStringUsingEncoding(NSUTF8StringEncoding));
'UnsafePointer<Int8>' is not convertible to 'UnsafeMutablePointer<char_t>'
如何创建 UnsafeMutablePointer?
最佳答案
这完全取决于 char_t
是什么。
如果 char_t
转换为 Int8
则以下将起作用。
if let cString = str.cStringUsingEncoding(NSUTF8StringEncoding) {
some_c_func(strdup(cString))
}
这可以折叠到
some_c_func(strdup(str.cStringUsingEncoding(NSUTF8StringEncoding)!))
警告! 如果 func cStringUsingEncoding(_:)
返回 nil
,第二种方法将导致崩溃。
针对 Swift 3 进行更新,并修复内存泄漏
如果 C 字符串仅在局部范围内需要,则不需要 strdup()
。
guard let cString = str.cString(using: .utf8) else {
return
}
some_c_func(cString)
cString
将具有与 str
相同的内存生命周期(至少非常相似)。
如果 C 字符串需要存在于本地范围之外,那么您将需要一个副本。该副本将需要被释放。
guard let interimString = str.cString(using: .utf8), let cString = strdup(interimString) else {
return
}
some_c_func(cString)
//…
free(cString)
关于swift - 在 Swift 中将字符串转换为 UnsafeMutablePointer<char_t>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27715037/