我和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
}
答案 0 :(得分:5)
inPct
常量的生命周期仅在循环迭代期间,因为它是块作用域的:
for i in 1...5 {
let x = 5
}
println(x) // compile error - Use of unresolved identifier x
在每次迭代中inPct
都引用一个新变量。您无法在任何迭代中分配任何inPct
,因为它们是使用let
声明的:
for i in 1...5 {
let x = 5
x = 6 // compile error
}
答案 1 :(得分:1)
在您定义:let possibleTipsInferred = [0.15, 0.18, 0.20]
时的基本单词中,这意味着possibleTipsInferred
是只读变量。你可以迭代它但不改变它。
此外,在Swift中你不能写:
let a:Int?
a = 5 // compile ERROR
因为a
的值为nil
,您无法对其进行更改。
在for..in
循环中,每次迭代i
都是重新创建并在每个循环中接收一个新实例。
因此,您可以使其保持不变并写入let
。
答案 2 :(得分:0)
for循环执行一系列语句,因此每次循环时我们都在一个新的&#34;范围内。&#34;这与C处理循环的方式非常相似。
每次我们运行for循环时,都会释放堆栈常量,以便我们可以重新分配 inPct 的值。
如果我们在for循环之外预先声明了一个变量并给它一个值,我们每次运行for循环时都会更新变量的值。
这是指向swift for for循环文档的链接:Control Flow