>我有一个类似于这样的"for"循环:
for i in 0...n - 1 {
// do stuff, n is not changed
}
过去,当我用 FORTRAN 编码时,我被告知这是一种非常低效的编码大型"for"循环的方法。
Swift 编译器是否识别不变极限并预先计算 n - 1?
我认为答案是肯定的。
1...n - 1
表示Range
对象。这是Range
的字面意思。因此,当编译到达循环并看到文字时,它会认为
您似乎要创建一个新的
Range<Int>
对象!给你!嗯。。。所以我想i
属于Int
型...
等等。
这意味着在创建对象时会评估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 中删除