gpt4 book ai didi

arrays - Swift 4.2) 使用 for_in/forEach 与按索引访问相比,改变结构数组

转载 作者:可可西里 更新时间:2023-11-01 01:56:41 26 4
gpt4 key购买 nike

我正在尝试修改数组中的结构元素。我发现您可以通过按索引访问(迭代)结构来做到这一点,但如果您使用“for in”循环或 forEach{},则不能。

struct Person
{
var age = 0
var name = "James"
}

var personArray = [Person]()
personArray += [Person(), Person(), Person()]


personArray.forEach({$0.age = 10}) // error: "Cannot assign to property: '$0' is immutable"

for person in personArray {
person.age = 10 // error: "Cannot assign to property: 'person' is a 'let' constant"
}


for index in personArray.indices {
personArray[index].age = 10 // Ok
}

谁能解释一下?

最佳答案

如其他答案所述,您不能在 for-in 循环或 .forEach 方法中进行变异。

您可以使用您上一个简短的公式:

for index in personArray.indices {
personArray[index].age = 10
}

或者完全改变原始的personArray:

personArray = personArray.map { person in 
var person = person // parameter masking to allow local mutation
person.age = 10
return person
}

请注意,第二个选项可能看起来效率较低,因为它每次都创建一个新的 Person 实例,但 Swift 似乎针对这些情况进行了很好的优化。

如果你真的想要一个变异的 .forEach 方法,这是一个额外的好处:

extension MutableCollection {
mutating func mutateEach(_ body: (inout Element) throws -> Void) rethrows {
for index in self.indices {
try body(&self[index])
}
}
}

这是一个与您的第一个公式等效的数组突变包装器,您可以按预期使用它:

personArray.mutateEach { $0.age = 10 }

关于arrays - Swift 4.2) 使用 for_in/forEach 与按索引访问相比,改变结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52770379/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com