Swift for var list.enumerated()

3

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

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(...)
}

但是我又收到了一个警告变量'index'从未被修改;考虑改为'let'常量,我不知道如何优雅地解决它。唯一的想法是添加一个新的var变量。是否还有其他方法可以避免这个警告呢?


1
请注意,enumerated()是一个方法而不是属性。 - Hamish
你是对的。抱歉。 - Béatrice Cassistat
1个回答

5

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 中而不是原始数组,所以我删除了我的评论。 - Hamish
我认为你指出这一点仍然是非常正确的,因为"mutating"方面很容易被误解为修改"array"元素的操作。 - par

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接