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 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中使用可选项迭代数组所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)