Swift 4 将字符串转换为 UnsafeMutablePointer<Int8>

Posted

技术标签:

【中文标题】Swift 4 将字符串转换为 UnsafeMutablePointer<Int8>【英文标题】:Swift 4 convert String to UnsafeMutablePointer<Int8> 【发布时间】:2018-12-24 05:22:15 【问题描述】:

我有一个 C API,其签名如下:

SendPing(char * content);

现在,我想从 Swift 中调用它。 Swift 似乎自动将其导入为:

SendPing(content: UnsafeMutablePointer<Int8>!)

但是,当我在 Swift 中尝试时:

var content:String = "sampledata"
SendPing(content)

我认为 Swift 可以自动处理“String”到“UnsafeMutablePointer”的转换,但事实并非如此。报告的错误是:“无法将 'String' 类型的值转换为预期的参数类型 'UnsafeMutablePointer!'。我记得它在 Swift 3.0 中有效,但我可能错了。

在 Swift 4.2 中处理这个问题的正确方法是什么?


有问题的解决方案:Swift convert string to UnsafeMutablePointer<Int8> 对我不起作用。我无法找出根本原因,但我猜这是由于 Swift 4.2 造成的。

【问题讨论】:

我之前没有注意到这个问题已经被问到here。 Swift convert string to UnsafeMutablePointer<Int8>的可能重复 @Kamran,谢谢。我已经尝试了您提供的链接中的方式,但它不起作用。到目前为止,我的方法似乎是最简单的。 有很多答案并且似乎有效。不知道为什么他们在你的情况下不起作用。如果您知道这已经被问到,那么您可以在该问题下添加您的答案,而不是重复相同的问题。 @Kamran,我在这上面花了几个小时并尝试了与这里不同的答案,但不幸的是我不够幸运。所以,我发布了一个新问题。很快,我就明白了。这就是发生的事情。我不打算创建一个问题然后自己回答。 【参考方案1】:

跟进与总结:

1) 链接 Swift convert string to UnsafeMutablePointer<Int8> 中的解决方案在 Swift 4 中不再有效。

2) 要从 String 中获取 UnsafeMutablePointer(Int8),最简单的方法是:

let contentPointer = strdup(content)

3) 但是,您应该始终牢记释放内存是调用者的责任。上面的代码将使用新的内存,并且必须在之后释放它。:

let contentPointer = strdup(content)
SendPing(content: contentPointer)
....

free(contentPointer)

否则,您将面临内存泄漏问题。

【讨论】:

以上是关于Swift 4 将字符串转换为 UnsafeMutablePointer<Int8>的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 将字符串转换为 UnsafeMutablePointer<Int8>

Swift 4 Codable:将 JSON 返回字符串转换为 Int/Date/Float

使用 Swift 4 Decodable 将字符串 JSON 响应转换为布尔值

Swift 4 - 解码期间字符串转换为大写

IOS SWIFT 4 使用区域设置将字符串转换为十进制

如何将 Int 数组转换为字符串? Swift 中的数组