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 %c\n",arg0,arg0[0],arg0[1],arg0[2]); printf("%p: %c %c %c\n",arg1,arg1[0],arg1[1],arg1[2]); printf("%p: %c %c %c\n",arg2,arg2[0],arg2[1],arg2[2]); printf("%p: %c %c %c\n",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 r0x101003170: T h r0x101003170: T h r0x101003170: 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
总结以上是内存溢出为你收集整理的为什么Swift在将可选String转换为UnsafePointer时返回一个意外的指针?全部内容,希望文章能够帮你解决为什么Swift在将可选String转换为UnsafePointer时返回一个意外的指针?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)