在Swift中使用C字符串,或者:如何将UnsafePointer转换为CString
在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 我可以找到的唯一方法是(使用How do you convert a String to a CString in the Swift Language?的代码): let s2a = String.fromCString(s2).bridgeToObjectiveC().UTF8String let s3 = strdup(s2a) 但是我觉得不满足于两个原因: >简单的任务太复杂了。 备注/背景:当然,使用高级数据结构(如Swift String或Objective-C NSString)的高级功能更为可取。但是有BSD的功能 在试图回答Accessing temp directory in Swift时遇到这个问题。 更新:从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
Swift 1.1(或者更早)有更好的C字符串桥接:
let haystack = "This is a simple string" let needle = "simple" let result = String.fromCString(strstr(haystack,needle)) CString类型完全消失。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |