加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在Swift中将String转换为UnsafeMutablePointer

发布时间:2020-12-14 02:23:35 所属栏目:百科 来源:网络整理
导读:我正在使用第三方c API,我试图用一个简单的字符串调用其中一个函数.像这样的东西: some_c_func("aString"); 我收到一个构建错误: Type 'UnsafeMutablePointerchar_t' does not conform to protocol 'StringLiteralConvertible' 我已经看到一些建议在字符串
我正在使用第三方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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读