评估以下代码,我希望单次打印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循环背后发生的事情。
| 归档时间: |
|
| 查看次数: |
385 次 |
| 最近记录: |