【问题标题】:Let type in a for in loop让我们输入一个 for in 循环
【发布时间】:2014-11-15 13:45:38
【问题描述】:

我在玩 Swift。 为什么可以在 for 循环中声明 let 类型?据我所知,let 表示恒定,所以我很困惑。

    func returnPossibleTips() -> [Int : Double] {
        let possibleTipsInferred = [0.15, 0.18, 0.20]
        //let possibleTipsExplicit:[Double] = [0.15, 0.18, 0.20]

        var retval = Dictionary<Int, Double>()
        for possibleTip in possibleTipsInferred {
            let inPct = Int(possibleTip * 100)
            retval[inPct] = calcTipWithTipPct(possibleTip)
        }

    return retval

    }

【问题讨论】:

  • let 定义了一个基于范围的常量——在你的情况下是在 for 循环中。这基本上意味着不可能为用“let”声明的变量分配新值。
  • 认为varMutableletImmutable 而不是一个常数。

标签: swift constants let


【解决方案1】:

inPct 常量的生命周期仅在循环迭代期间,因为它是块作用域:

for i in 1...5 {
    let x = 5
}
println(x) // compile error - Use of unresolved identifier x

在每次迭代中,inPct 引用一个新变量。您不能在任何迭代中分配给任何 inPcts,因为它们是用 let 声明的:

for i in 1...5 {
    let x = 5
    x = 6 // compile error
}

【讨论】:

    【解决方案2】:

    在你定义的基本单词中:let possibleTipsInferred = [0.15, 0.18, 0.20] 意味着possibleTipsInferred只读变量。你可以迭代它但不能改变它。

    此外,在 Swift 中你不能写:

    let a:Int?
    a = 5      // compile ERROR
    

    因为a 的值是nil,你不能改变它。


    for..in 循环中,每次迭代i 都会重新创建,并在每个循环中接收一个新实例。

    因此你可以让它保持不变并写成let

    【讨论】:

      【解决方案3】:

      for 循环执行一系列语句,因此每次循环我们都处于一个新的“范围”中。这与 C 处理 for 循环的方式非常相似。

      每次执行 for 循环时,堆栈常量都会被释放,因此我们可以重新分配 inPct 的值。

      如果我们在 for 循环之外预先声明了一个变量并给它一个值,我们将在每次运行 for 循环时更新该变量的值。

      这里是 swift 中 for 循环文档的链接:Control Flow

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-12
        • 2023-03-31
        相关资源
        最近更新 更多