gpt4 book ai didi

swift - 为什么快速枚举中的可选项会导致无限循环?

转载 作者:行者123 更新时间:2023-12-03 09:15:40 26 4
gpt4 key购买 nike

评估以下代码,我预计 Hello World 的单次打印.相反,它会导致无限循环。有人可以解释为什么吗?

let array = ["what"]
for text: String? in array {
print("Hello World")
}
(删除可选的 ? 显然使它只打印一次)

最佳答案

这是一个意想不到的结果,但它的发生是因为 Swift for in 的方式循环在引擎盖下工作。for in接受一个变量和一个 Sequence . swift 来电makeIterator()Sequence获取 IteratorProtocolnext() 时返回连续的项目在迭代器上调用。 next()返回一个 Optional 以便它可以返回 nil当所有元素都用完时。
在正常情况下,您会收到非可选值,而 Swift 会继续提供它们,直到 nil在这种情况下循环结束。
当您不使用可选项时,这相当于您的代码:

let array = ["what"]
var iter = array.makeIterator()
while let text = iter.next() {
print("Hello World")
}
可选绑定(bind) ( while let ) 在 iter.next() 时失败返回 nil循环结束。
在您的情况下,您已经说过您将明确收到 nil值(通过将循环变量声明为可选),所以当 next()在迭代器上被调用并且它没有值,它会给你一个 nil您慷慨地收到并继续循环。迭代器继续分发 nil然后你继续服用它们,你就有了一个无限循环。
当您使用可选时,这相当于您的代码:
let array = ["what"]
var iter = array.makeIterator()
while let text: String? = iter.next() {
print("Hello World")
}
在这种情况下,可选绑定(bind)始终有效,因为 text可以收到 nil .
This blog对使用 Swift for in 的幕后发生的事情进行了很好的详细解释循环。

关于swift - 为什么快速枚举中的可选项会导致无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65553800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com