Xcode 在Swift中迭代集合:var与let

Xcode 在Swift中迭代集合:var与let,xcode,swift2,Xcode,Swift2,我有一个方法,它迭代一个数组,并用每个元素作为参数调用另一个方法。如果我将此方法声明为: func didFinishedListFiles(files: [FileModel]) { for var fileData in files { self.downloadSingleFile(NSUUID(UUIDString: fileData.uuid!)!); } } Xcode显示一个警告: 变量“fileData”从未发生变异;考虑更改为“让”常量 但是如

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

func didFinishedListFiles(files: [FileModel]) {
    for var fileData in files {
        self.downloadSingleFile(NSUUID(UUIDString: fileData.uuid!)!);
    }
}
Xcode显示一个警告:

变量“fileData”从未发生变异;考虑更改为“让”常量

但是如果我将
var
更改为
let

func didFinishedListFiles(files: [FileModel]) {
    for let fileData in files {
        self.downloadSingleFile(NSUUID(UUIDString: fileData.uuid!)!);
    }
}    
Xcode显示一个错误:

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


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

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

因此,以下是:

for fileData in files { /*...*/ }
…相当于:

var index = 0
while index < files.count {
    let fileData = files[index]
    //...
    index += 1
}
var索引=0
而index
只有当您想要改变绑定时,您才会想在
中为-
绑定添加
var
,也就是说,如果它是一个对象引用,您希望能够在循环的单次传递中指向其他对象,或者是一个您希望能够更改的值类型,但看起来并不是这样做的这两种情况中的任何一种,因此在此绑定中使用
var
都是多余的


(Swift 3去掉了很多可以使隐式不可变绑定可变的地方,但将
留给var
作为一个例外-如果您想在循环过程中更改某些内容,这仍然是可能的。)

不只是
对于文件中的文件数据吗{…
。不需要var或let。谢谢,你是对的…不客气。我认为它隐式地使它成为
let
,如果你想在集合中变异对象,那么你必须显式地将它设置为
var
删除
let
var
,因此在这种情况下,对于文件中的文件数据将是