为什么Swift在将可选String转换为UnsafePointer时返回一个意外的
我注意到在使用C库时出现了一些不寻常的行为,该库以const char *(将其作为UnsafePointer转换为
Swift< Int8>!)转换为Swift;传递一个字符串按预期工作,但一个字符串?似乎破坏了输入.考虑我写的测试:
func test(_ input: UnsafePointer<UInt8>?) { if let string = input { print(string[0],string[1],string[2],string[3],string[4],string[5]) } else { print("nil") } } let input: String = "Hello" test(input) 这按预期工作,为输入字符串打印以空值终止的UTF-8字节列表:72 101 108 108 111 0 但是,如果我将输入更改为可选字符串,那么它将变为: let input: String? = "Hello" 我在结果中得到了一组完全不同的值(176 39 78 23 1 0),尽管我希望它是相同的.传递nil按预期工作. C库的函数允许NULL代替字符串,我有时也希望在Swift中传递它,因此输入字符串是可选的是有意义的. 这是Swift中的一个错误,还是Swift没有设计来处理这种情况?无论哪种方式,处理这种情况的最佳方法是什么? 编辑 它似乎与多个参数有关. C函数: void multiString(const char *arg0,const char *arg1,const char *arg2,const char *arg3) { printf("%p: %c %c %cn",arg0,arg0[0],arg0[1],arg0[2]); printf("%p: %c %c %cn",arg1,arg1[0],arg1[1],arg1[2]); printf("%p: %c %c %cn",arg2,arg2[0],arg2[1],arg2[2]); printf("%p: %c %c %cn",arg3,arg3[0],arg3[1],arg3[2]); } 迅速: let input0: String? = "Zero" let input1: String? = "One" let input2: String? = "Two" let input3: String? = "Three" multiString(input0,input1,input2,input3) 结果是: 0x101003170: T h r 0x101003170: T h r 0x101003170: T h r 0x101003170: T h r 似乎有一个错误,Swift如何处理多个参数. 解决方法
如果这是期望的行为或只是一个错误,我没有找到任何有用的东西.
实用的解决方案可能只是拥有这样的代理方法,但你可能已经做过类似的事了. func proxy(_ str: String?,_ functionToProxy: (UnsafePointer<UInt8>?) -> ()) { if let str = str { functionToProxy(str) } else { functionToProxy(nil) } } proxy(input,test) 你测试过它是否在Swift 2中运行?他们改变了Swift 3中可能相关的东西: https://github.com/apple/swift-evolution/blob/master/proposals/0055-optional-unsafe-pointers.md (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |