在Swift中将String转换为UnsafeMutablePointer

前端之家收集整理的这篇文章主要介绍了在Swift中将String转换为UnsafeMutablePointer前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用第三方c API,我试图用一个简单的字符串调用其中一个函数.像这样的东西:
some_c_func("aString");

我收到一个构建错误

Type 'UnsafeMutablePointer<char_t>' does not conform to protocol 'StringLiteralConvertible'

我已经看到一些建议在字符串或类似的转换上使用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相关文章