修改结构时,不能在不可变值错误上使用mutating成员

时间:2017-07-31 08:32:35

标签: ios arrays swift struct

我有这个简单的结构。

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时,我收到错误无法在不可变值上使用变异成员:'部分'是一个“让...”恒定

如何解决此问题?

4 个答案:

答案 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
    }
}