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