快速编译器优化'for'循环



>我有一个类似于这样的"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 中删除

最新更新