大佬教程收集整理的这篇文章主要介绍了为什么Swift在将可选String转换为UnsafePointer时返回一个意外的指针?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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 r 0x101003170: T h r 0x101003170: T h r 0x101003170: T h r
实用的解决方案可能只是拥有这样的代理方法,但你可能已经做过类似的事了.
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时返回一个意外的指针?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。