我对Swift如何捕获可变和不可变的struct
感到困惑我的代码异步下载图像,下载完成后,将调用完成闭包。
在以下代码中,它打印捕获的index
值。第一个代码仅打印17
。但第二个代码将打印0 1 2 ... 16
。 (sponsorClass.count == 17)
第一个代码是
var index = 0
for sponsor in sponsorClass{
var image = AsynchronousLoadImage( sponsor.imageURL ){ loadedImage in
println("\(index)") //print 17
}
index++
}
,第二个代码是
var index = 0
for sponsor in sponsorClass{
let tempIndex = index
var image = AsynchronousLoadImage( sponsor.imageURL ){ loadedImage in
println("\(tempIndex)") //print 0,1,2,..,16
}
index++
}
答案 0 :(得分:1)
在执行语句时,您必须将var
或let
语句视为创建变量(或常量),以便了解发生了什么。该语句在每次执行时都会创建一个新变量(或常量)。
在第一个示例中,在循环开始之前,您创建一个名为index
的变量。每个闭包(您创建其中的17个)“关闭”相同的index
变量。这意味着每个闭包共享 index
变量与外部作用域(定义{{1}}的块)和所有其他闭包。只有index
的一个“副本”,所以当你在循环中修改它时,每个闭包都会看到修改(当闭包最终运行时)。
在第二个示例中,您将在每次循环迭代中创建一个名为index
的新变量。这17个变量彼此独立。每个闭包都关闭在与闭包相同的循环迭代中创建的变量。也就是说,在tempIndex
关闭同时index == 0
创建的tempIndex
时创建的关闭,以及在index == 0
关闭index == 1
时创建的关闭是在tempIndex
时创建的,依此类推。因此,您创建了17个独立变量(每个变量名为index == 1
)和17个闭包,每个闭包关闭一个单独的变量。由于您在创建它们之后永远不会修改任何17个tempIndex
变量,因此每个闭包都会看到分配给其相应变量的原始值。
答案 1 :(得分:0)
简单地说:
Let = immutable var(constant) - 值CAN' T被改变。
Var = mutable(variable) - 可以更改值。