xcode - 在 Swift : var vs. 中迭代集合

标签 xcode swift2

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

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



但如果我改变 varlet :
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
}

您想添加 varfor - in仅当您想要改变该绑定(bind)时才绑定(bind) - 也就是说,如果它是一个对象引用,您希望能够在单次循环期间指向其他东西,或者您希望能够更改的值类型.但看起来你并没有做这两件事,所以使用 var因为这种绑定(bind)在这里是多余的。

(Swift 3 去掉了许多可以使隐式不可变绑定(bind)可变的地方,但留下了 for var 作为一个异常(exception)——如果你想在循环期间更改某些内容,它仍然是可能的。)

关于xcode - 在 Swift : var vs. 中迭代集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33697364/

相关文章:

iphone - 链接使用 SDK 3.0 创建的静态库时,使用 Base SDK 3.0 构建 iPhone SDK 2.x 目标

swift - 制作爆炸动画SKaction并移除

ios - iOS Firebase框架是否将文件下载到其他队列中?

ios - iPhone 已拒绝启动请求 Unspecified

ios - XCode 错误 itms-90035 - GCManager.o 的签名无效

ios - 自定义 UIPickerView - 限制用户一次只能旋转一个轮子

ios - 如何在开发人员之间使用一台设备

xcode - Swift 2 - 使用 UIActivityViewController 分享视频

ios - 基于NSDate将数组映射到字典

Swift if 语句问题