Swift   发布时间:2022-04-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么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 %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

似乎有一个错误,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时返回一个意外的指针?所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。