我有这个简单的结构。
struct Section {
let store: Store
var offers: [Offer]
}
在VC中,我已经在顶部声明了这些Section
的数组,如fileprivate var sections: [Section] = []
。我在Section
中添加了一些viewDidLoad()
个对象。
稍后,我需要从某些Offer
内的offers
数组中删除一些Section
个对象。
我遍历sections
数组,找到包含需要删除的Section
的{{1}}。
Offer
但是当我尝试从for section in sections {
if let i = section.offers.index(where: { $0.id == offer.id }) {
section.offers.remove(at: i) // Cannot use mutating member on immutable value: 'section' is a 'let' constant
}
}
数组中删除该特定Offer
时,我收到错误无法在不可变值上使用变异成员:'部分'是一个“让...”恒定
如何解决此问题?
答案 0 :(得分:4)
默认情况下,for
中定义的变量为let
且无法更改。所以你必须把它变成var.
更简单的解决方案:
for var section in sections {
if let i = section.offers.index(where: { $0.id == offer.id }) {
section.offers.remove(at: i)
}
}
答案 1 :(得分:2)
当你执行 sections struct(值类型)的for循环时, section 变量是不可变的。您无法直接修改其值。您必须创建每个Section对象的可变版本,进行修改并分配回数组(在右侧索引处替换已修改的对象)。例如:
sections = sections.map({
var section = $0
if let i = section.offers.index(where: { $0.id == offer.id }) {
section.offers.remove(at: i)
}
return section
})
答案 2 :(得分:0)
使用for
循环时,变量是let
常量。
要修复它,你应该使用这个循环:
for index in in 0..<sections.count {
var section = sections[index]
[...]
}
答案 3 :(得分:0)
由于 For loop 上的参考对象是不可变的,你必须创建一个你必须在其上播放逻辑的中间变量。
此外,您使用值类型(结构),您必须在完成后从中间变量更新数据源。
for j in 0 ..< sections.count {
var section = sections[j]
if let i = section.offers.index(where: { $0.id == offer.id }) {
aSection.offers.remove(at: i) // Cannot use mutating member on immutable value: 'section' is a 'let' constant
sections[j] = section
}
}