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

Ken*_*eth 30 swift

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

let array = ["what"]
for text: String? in array {
    print("Hello World")
}
Run Code Online (Sandbox Code Playgroud)

(删除可选?显然使它只打印一次)

vac*_*ama 26

这是一个意想不到的结果,但它之所以发生是因为 Swiftfor in循环在幕后的工作方式。

for in接受一个变量和一个Sequence. 斯威夫特呼吁makeIterator()Sequence得到一个IteratorProtocol当它返回连续项next()被称为在迭代器。 next()返回一个Optional以便nil在所有项目都用完时它可以返回。

在正常情况下,您会收到非可选值,并且 Swift 会继续发出它们,直到nil收到为止,在这种情况下循环结束。

当您不使用optional时,这等效于您的代码:

let array = ["what"]
var iter = array.makeIterator()
while let text = iter.next() {
    print("Hello World")
}
Run Code Online (Sandbox Code Playgroud)

所述可选的结合while let)失败时iter.next()返回nil,循环结束。

在您的情况下,您已经说过您将显式接收nil值(通过将您的循环变量声明为一个optional),因此当next()在迭代器上调用并且它没有值时,它会交给您一个nil您亲切地接收并且循环继续. 迭代器继续分发nil,你继续接受它们,你有一个无限循环。

当您使用optional时,这等效于您的代码:

let array = ["what"]
var iter = array.makeIterator()
while let text: String? = iter.next() {
    print("Hello World")
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,可选绑定始终有效,因为text可以接收nil.

这篇博客很好地详细解释了 Swiftfor in循环背后发生的事情。