迭代Swift中的集合:var vs. let

时间:2015-11-13 16:26:11

标签: xcode swift2

我有一个迭代数组的方法,并以每个元素作为参数调用其他方法。如果我将此方法声明为:

func didFinishedListFiles(files: [FileModel]) {
    for var fileData in files {
        self.downloadSingleFile(NSUUID(UUIDString: fileData.uuid!)!);
    }
}

Xcode显示警告:

  

变量' fileData'从未发生变异;考虑改为“让”#39;恒定

但如果我将var更改为let

func didFinishedListFiles(files: [FileModel]) {
    for let fileData in files {
        self.downloadSingleFile(NSUUID(UUIDString: fileData.uuid!)!);
    }
}    

Xcode显示错误:

  

'让'模式不能嵌套在已经不可变的上下文中

如何在没有任何警告/错误的情况下实施它的正确方法?

1 个答案:

答案 0 :(得分:8)

for - in模式隐式使用常量绑定(在它创建的范围内。也就是说,您的fileData绑定自动为本地let,因此每次通过循环都是常数。

以下内容:

for fileData in files { /*...*/ }

......相当于:

var index = 0
while index < files.count {
    let fileData = files[index]
    //...
    index += 1
}

只有当你想改变那个绑定时,你才想将var添加到for - in绑定中 - 也就是说,如果它是你想要的对象引用能够在单次通过循环期间指向其他内容,或者您​​希望能够更改的值类型。但它看起来并不像你正在做这两件事,所以在这里使用var这个绑定将是多余的。

(Swift 3摆脱了许多你可以使隐式不可变绑定变为可变的地方,但是将for var作为例外 - 如果你想在循环中改变某些东西,它仍然是可能的。)