令人惊讶的结果是在Swift中使用可选项迭代数组

令人惊讶的结果是在Swift中使用可选项迭代数组,第1张

概述我很惊讶这个快速的代码行为很好: let values = ["Hello", "Test"]var count = 0for string: String in values { count = count + 1 print("count is: ", count) print(string)} 输出: count is: 1Hellocount is: 我很惊讶这个快速的代码行为很好:

let values = ["Hello","Test"]var count = 0for string: String in values {    count = count + 1    print("count is: ",count)    print(string)}

输出:

count is:  1Hellocount is:  2Test

但将String变为String?创造一个无限循环.

let values = ["Hello","Test"]    var count = 0    for string: String? in values {        count = count + 1        print("count is: ",count)        print(string)    }

输出:

count is:  1Optional("Hello")count is:  2Optional("Test")count is:  3nilcount is:  4nilcount is:  5nilcount is:  6nilcount is:  7nilcount is:  8(ad infinitum)

Swift非常擅长捕捉奇怪的代码问题,我很惊讶我可以在没有警告或错误的情况下陷入如此混乱.
这真的是人们对Swift 4的期望吗?如果是这样,为什么?

解决方法 要理解这个问题,有助于回忆for-for循环的工作原理:

for s in values {    print(s)}

创建序列的迭代器,并调用迭代器的next()方法,直到返回nil为止:

var it = values.makeIterator()while let s = it.next() {    print(s)}

你的第二个版本相当于

var it = values.makeIterator()while let s: String? = it.next() {    print(s)}

现在编译器发出警告:

warning: explicitly specifIEd type 'String?' adds an additional levelof optional to the initializer,making the optional check always succeed    while let s: String? = it.next() {          ^      ~~~~~~~   ~~~~~~~~~                 String

那么这里发生的是String?从it.next()返回
被包装成一个“嵌套的可选”.some(it.next()),类型为String ??,然后可选地绑定到s:String?.
这总是成功的,因为.some(it.next())不是String ??.none.
因此循环永远不会终止.

有人可能会争辩说编译器也应该警告

for s: String? in values {    print(s)}
总结

以上是内存溢出为你收集整理的令人惊讶的结果是在Swift中使用可选项迭代数组全部内容,希望文章能够帮你解决令人惊讶的结果是在Swift中使用可选项迭代数组所遇到的程序开发问题。

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

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

原文地址: https://outofmemory.cn/web/1007858.html

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

发表评论

登录后才能评论

评论列表(0条)

保存