在Swift中使用C字符串,或者:如何将UnsafePointer转换为CString

在Swift中使用C字符串,或者:如何将UnsafePointer转换为CString,第1张

概述在Swift中使用标准C库函数时,遇到问题 当传递C字符串时。作为一个简单的例子(只是为了演示问题),标准C库函数 char * strdup(const char *s1); 暴露于Swift as func strdup(_: CString) -> UnsafePointer<CChar> 这意味着strdup()的返回值不能传递给另一个strdup()调用: let s1 : CStrin 在Swift中使用标准C库函数时,遇到问题
当传递C字符串时。作为一个简单的例子(只是为了演示问题),标准C库函数
char * strdup(const char *s1);

暴露于Swift as

func strdup(_: CString) -> UnsafePointer<CChar>

这意味着strdup()的返回值不能传递给另一个strdup()调用:

let s1 : CString = "abc"let s2 = strdup(s1) // OK,s2 is a UnsafePointer<CChar>let s3 = strdup(s2) // error: Could not find an overload for '__conversion' that accepts the supplIEd arguments

我的问题是:如何从UnsafePointer< CChar>创建Swift CString
使得一个标准库函数返回的C字符串可以传递给另一个函数?

我可以找到的唯一方法是(使用How do you convert a String to a CString in the Swift Language?的代码):

let s2a = String.fromCString(s2).brIDgetoObjectiveC().UTF8Stringlet s3 = strdup(s2a)

但是我觉得不满足于两个原因:

>简单的任务太复杂了。
>(主要原因:)上述转换仅在C字符串为有效的UTF-8时有效
字符串,否则它会失败并出现运行时异常。但是一个C字符串是一个任意的
字符序列,由Nul字符分隔。

备注/背景:当然,使用高级数据结构(如Swift String或Objective-C Nsstring)的高级功能更为可取。但是有BSD的功能
标准C库在基础框架中没有确切的对应。

在试图回答Accessing temp directory in Swift时遇到这个问题。
这里,mkdtemp()是不存在精确NSfileManager替换的BSD函数
(我所知道的)。
mkdtemp()返回UnsafePointer< CChar>必须传递给
NSfileManager函数stringWithfileSystemRepresentation需要一个CString
论据。

更新:从Xcode 6 beta 6开始,此问题不再存在,因为C-Strings映射到Swift已被简化。你可以写

let s1 = "abc"      // Stringlet s2 = strdup(s1) // UnsafeMutablePointer<Int8>let s3 = strdup(s2) // UnsafeMutablePointer<Int8>let s4 = String.fromCString(s3) // String
Swift 1.1(或者更早)有更好的C字符串桥接:
let haystack = "This is a simple string"let needle = "simple"let result = String.fromCString(strstr(haystack,needle))

CString类型完全消失。

总结

以上是内存溢出为你收集整理的在Swift中使用C字符串,或者:如何将UnsafePointer转换为CString全部内容,希望文章能够帮你解决在Swift中使用C字符串,或者:如何将UnsafePointer转换为CString所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1055310.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存