令人惊讶的结果是在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非常擅长捕捉奇怪的代码问题,我很惊讶我可以在没有警告或错误的情况下陷入如此混乱. 解决方法
要理解这个问题,有助于回忆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()返回 有人可能会争辩说编译器也应该警告 for s: String? in values { print(s) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |