当传递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().UTF8String let 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" // String let s2 = strdup(s1) // UnsafeMutablePointer<Int8> let s3 = strdup(s2) // UnsafeMutablePointer<Int8> let s4 = String.fromCString(s3) // String
let haystack = "This is a simple string" let needle = "simple" let result = String.fromCString(strstr(haystack,needle))
CString类型完全消失。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。