为什么Swift在将可选String转换为UnsafePointer时返回一个意外的指针?

为什么Swift在将可选String转换为UnsafePointer时返回一个意外的指针?,第1张

概述我注意到在使用C库时出现了一些不寻常的行为,该库以const char *(将其作为UnsafePointer转换为 Swift< Int8>!)转换为Swift;传递一个字符串按预期工作,但一个字符串?似乎破坏了输入.考虑我写的测试: func test(_ input: UnsafePointer<UInt8>?) { if let string = input { p 我注意到在使用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 %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时返回一个意外的指针?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1015842.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存