Swift如何捕获可变和不可变的结构

时间:2015-06-26 04:54:06

标签: swift

我对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++
}

2 个答案:

答案 0 :(得分:1)

在执行语句时,您必须将varlet语句视为创建变量(或常量),以便了解发生了什么。该语句在每次执行时都会创建一个新变量(或常量)。

在第一个示例中,在循环开始之前,您创建一个名为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) - 可以更改值。