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

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

发布时间:2020-12-14 04:43:40 所属栏目:百科 来源:网络整理
导读:我很惊讶这个快速的代码行为很好: 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:  1
Hello
count is:  2
Test

但将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:  1
Optional("Hello")
count is:  2
Optional("Test")
count is:  3
nil
count is:  4
nil
count is:  5
nil
count is:  6
nil
count is:  7
nil
count 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 level
of 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)
}

(编辑:李大同)

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

    推荐文章
      热点阅读