加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:56:14 所属栏目:百科 来源:网络整理
导读:我注意到在使用C库时出现了一些不寻常的行为,该库以const char *(将其作为UnsafePointer转换为 Swift Int8!)转换为Swift;传递一个字符串按预期工作,但一个字符串?似乎破坏了输入.考虑我写的测试: func test(_ input: UnsafePointerUInt8?) { if let strin
我注意到在使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读