【问题标题】:Swift 4 Reduce problem: Cannot use mutating member on immutable value: function call returns immutable valueSwift 4 Reduce 问题:不能在不可变值上使用变异成员:函数调用返回不可变值
【发布时间】:2019-03-23 10:34:06
【问题描述】:

我被卡住了

不能对不可变值使用变异成员:函数调用返回不可变值

这段代码出错:

var bagsToScan: [BagQR] {
    var initial: [Bag] = []
    return TaskManager.shared.tasks.value
        .filter({ $0.state == .ready })
        .reduce(initial) { (acc, task) in
            var bagQR = task.bags.filter({
                !tasksChecked.contains(BagQR(bag: $0, taskName: task.name).taskName)
            }).map({
                BagQR(bag: $0, taskName: task.name)
            })

            acc.append(contentsOf: bagQR)
        }.sort({ $0.bag.scanIndex < $1.bag.scanIndex })
}

错误打印在reduce(initial) { (acc, task) in 行。 感谢您的帮助!

【问题讨论】:

  • acc 在 reduce 闭包中是不可变的。试试return acc + bagQR。
  • 将排序更改为已排序。

标签: swift closures reduce


【解决方案1】:

使用reduce(into:_:)

.reduce(into: initial) { (acc, task) in
//...

这将使acc 可变。

然后在reduce的结果上使用sorted(by:)。

.sorted(by: { $0.bag.scanIndex < $1.bag.scanIndex })

【讨论】:

  • @Kwocs 您问题中的代码有两个错误:acc.append 和.sort
  • 感谢您的帮助。您是否有任何解释提示错误是在减少行而不是在 acc.append 和 sort 上?
  • 函数的结果是不可变的。不允许尝试对其进行排序。它就在错误消息中function call returns immutable value
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 2021-10-12
相关资源
最近更新 更多