【问题标题】:Iterating over a collection in Swift: var vs. let在 Swift 中迭代集合:var vs. let
【发布时间】:2015-11-13 16:26:10
【问题描述】:

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

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 fileData in files {...。不需要 var 或 let。
  • 谢谢,你是对的... ehhh
  • 不客气。我认为它隐含地使它成为let,如果你想改变集合中的对象,那么你必须明确地将它设置为var

标签: xcode swift2


【解决方案1】:

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

所以如下:

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

...等价于:

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

只有当您想要改变该绑定时,您才需要将var 添加到for-in 绑定——也就是说,如果它是您希望能够指向某物的对象引用else 在单次循环中,或者您希望能够更改的值类型。但看起来你并没有做这两件事,所以在这里使用 var 进行绑定是多余的。

(Swift 3 去掉了很多可以让隐式不可变绑定变为可变的地方,但将 for var 作为一个例外——如果你想在循环期间更改某些内容,它仍然是可能的。)

【讨论】:

  • 删除letvar,所以在这种情况下它将是for fileData in files
猜你喜欢
  • 2014-11-16
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 2016-04-05
  • 2021-09-14
  • 2016-03-11
相关资源
最近更新 更多