我有一个与此类似的“for”循环:
for i in 0...n - 1 {
// do stuff, n is not changed
}
以前,当我用 FORTRAN 编写代码时,有人告诉我这是编写大型“for”循环的一种非常低效的方法。
Swift 编译器是否识别不变的限制并预先计算 n - 1?
最佳答案
我认为答案是肯定的。
1...n - 1
代表 Range
目的。它是 Range
的文字.因此,当编译到达循环并看到字面量时,它认为
It seems like that you want to create a new
Range<Int>
object! Here you go! Hmm... So I guessi
is of typeInt
...
等等。
这意味着n - 1
在创建对象时进行评估。它保持这种状态,而不是第二次评估它。此代码通过不只打印一个 hello 来证明这一点:
var n = 10
for i in 1...n - 1 {
n = 2
print("Hello")
}
是的。
注意:
- 最好用
1..<n
而不是1...n - 1
在这种情况下,它们是相同的。 - Apple 实际上建议您使用这种方法而不是 C 风格的 for 循环。
- C 风格的 for 循环将在 Swift 3 中被移除
关于 'for' 循环的 Swift 编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36111869/