Swift for var list.enumerated()

Posted

技术标签:

【中文标题】Swift for var list.enumerated()【英文标题】: 【发布时间】:2017-08-22 05:14:24 【问题描述】:

我有一个对象数组,其类型是具有变异函数的结构。所以我得到了这个代码:

for (index, object) in objects.enumerated() 
     otherArray[index] = object.someMutatingFunction(...)

这导致我出现此错误Cannot use mutating member on immutable value of type 'Blabla',我可以通过添加 var 来修复它:

for var (index, object) in objects.enumerated() 
     otherArray[index] = object.someMutatingFunction(...)

但后来我收到另一个警告Variable 'index' was never mutated; consider changing to 'let' constant,我不知道如何优雅地修复它。唯一的想法是添加一个新的 var 变量。我还能做些什么来阻止这个警告吗?

【问题讨论】:

请注意enumerated() 是一个方法,而不是一个属性。 你是对的。对不起。 【参考方案1】:

object 变量前加上var 关键字:

struct S 
    mutating func f()  


let array = [S(), S()]

for (index, var object) in array.enumerated() 
    object.f()

请注意,Hamish 在对此答案的评论中指出,array 的元素不会被修改。只能修改for循环范围内的object的本地副本。

如果你想修改array,你必须在for循环范围之外声明它var,然后分配给array索引。

【讨论】:

实际上意识到 OP 正在寻找将变异元素分配到另一个数组 otherArray 而不是原始数组,所以我删除了我的评论。 我认为您指出这一点仍然非常正确,因为mutating 方面很容易被误解为修改array 的元素。

以上是关于Swift for var list.enumerated()的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将 Int 转换为字符

swift学习笔记 - swift中常用关键字

Swift 关键字汇总

Swift 中“static var”和“var”的区别

Swift 中的 `let` 和 `var` 有啥区别?

为啥在 Swift 中使用“let”而不是 var?