【问题标题】:Swift for var list.enumerated()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() 是一个方法,而不是一个属性。
  • 你是对的。对不起。

标签: swift for-loop var let


【解决方案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 的元素。
猜你喜欢
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2022-01-14
  • 2015-01-29
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多