我有一个迭代数组并以每个元素作为参数调用其他方法的方法。如果我将此方法声明为:
func didFinishedListFiles(files: [FileModel]) {
for var fileData in files {
self.downloadSingleFile(NSUUID(UUIDString: fileData.uuid!)!);
}
}
Xcode 显示警告:
Variable 'fileData' was never mutated; consider changing to 'let' constant
但如果我改变
var
至let
:func didFinishedListFiles(files: [FileModel]) {
for let fileData in files {
self.downloadSingleFile(NSUUID(UUIDString: fileData.uuid!)!);
}
}
Xcode 显示错误:
'let' pattern cannot appear nested in an already immutable context
如何在没有任何警告/错误的情况下实现它的正确方法?
最佳答案
for
- in
模式隐式使用常量绑定(bind)(在它创建的范围内。也就是说,您的 fileData
绑定(bind)自动是本地的 let
,因此每次通过循环时都是常量。
所以以下内容:
for fileData in files { /*...*/ }
...相当于:
var index = 0
while index < files.count {
let fileData = files[index]
//...
index += 1
}
您想添加
var
到for
- in
仅当您想要改变该绑定(bind)时才绑定(bind) - 也就是说,如果它是一个对象引用,您希望能够在单次循环期间指向其他东西,或者您希望能够更改的值类型.但看起来你并没有做这两件事,所以使用 var
因为这种绑定(bind)在这里是多余的。(Swift 3 去掉了许多可以使隐式不可变绑定(bind)可变的地方,但留下了
for var
作为一个异常(exception)——如果你想在循环期间更改某些内容,它仍然是可能的。)
关于xcode - 在 Swift : var vs. 中迭代集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33697364/