swift - 在 Swift 中将字符串转换为 UnsafeMutablePointer<char_t>

标签 swift cstring

我正在使用第三方 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/

相关文章:

C++ 将字节值作为 int 添加到 CString

c - 末尾带有垃圾字符的字符串数组

swift - 通过符合 Swift 2 中的协议(protocol)扩展类型化数组

ios - 从右到左支持 iOS

swift - 在选择器 View 中选择项目后需要显示 TextView

ios - 具有多个自定义单元格类型的 RxSwift TableView

c++ - 如何从字符数组创建 CString?

ios - ARKit:如何将 .obj 文件放置在具有多种 Material 的平面上

c++ - 如何将 ATL/MFC CString 转换为 QString?

c - 查看列表中下一个节点的地址时程序崩溃;只发生在非常奇怪的情况下