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

Dom*_*alo 7 xcode swift2

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

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

Xcode显示警告:

变量'fileData'从未发生变异; 考虑改为'让'不变

但如果我var改为let:

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

Xcode显示错误:

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

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

ric*_*ter 8

for- in模式隐含采用恒定结合(在其创建的范围也就是说,你的.fileData结合自动在本地let,因此不断为每一位通过循环.

所以以下内容:

for fileData in files { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

......相当于:

var index = 0
while index < files.count {
    let fileData = files[index]
    //...
    index += 1
}
Run Code Online (Sandbox Code Playgroud)

只有当你想改变那个绑定时,你才想添加varfor- inbinding中 - 也就是说,如果它是一个对象引用,你希望能够在单个循环中指向其他东西,或者一个值您希望能够更改的类型.但它看起来不像你正在做这两件事,所以var在这里使用这种绑定将是多余的.

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