我有一个迭代数组的方法,并以每个元素作为参数调用其他方法。如果我将此方法声明为:
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显示错误:
'让'模式不能嵌套在已经不可变的上下文中
如何在没有任何警告/错误的情况下实施它的正确方法?
答案 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
作为例外 - 如果你想在循环中改变某些东西,它仍然是可能的。)