标记闭包元素可变Swift

问题描述 投票:0回答:2

我有2个结构,第一个是:

struct LineData {

    init (name: String,
          colorValue: String,
          values: [Int]){
        self.name = name
        self.colorValue = colorValue
        self.values = values
    }

    private var cachedMaxValue: Int? = nil
    let name: String
    let colorValue: String
    let values: [Int]

    // describe max value for Y axis for specific Line
    mutating func maxValue() -> Int{
        if let cached = cachedMaxValue {
            return cached
        }
        self.cachedMaxValue = values.max()
        return cachedMaxValue ?? 0
    }
}

第二个有LineData结构阵列:

struct CharData {

    init(xAxis: XAxis,
         lines: [LineData]){
        self.xAxis = xAxis
        self.lines = lines
    }

    private var cachedMaxValue: Int? = nil

    var xAxis: XAxis
    var lines: [LineData]

    // describe max value for Y axis among lines
    func maxValue() -> Int{

        var maxValues: [Int] = []
        lines.forEach{it in
            maxValues.append(it.maxValue())
        }

        return 0
    }
}

上面的代码不能编译,因为,对于struct maxValues,方法CharData上的错误。它说Cannot use mutating member on immutable value: 'it' is a 'let' constant

我想要的是,遍历一系列的行,其中最大值找到更大的价值。

swift
2个回答
1
投票

由于lines是一个普通的数组,简单来说:

    for i in 0..<lines.count {
        maxValues.append(lines[i].maxValue())
    }

也许不太像Swifty,但没有任何东西被复制。优化器应该给你几乎与forEach相同的性能。


1
投票

它是forEach中的it参数/对象,它是不可变的。就像错误说:“这是一个让”。你可能会做这样的事情:

lines.forEach { it in
    var mutableIt = it
    maxValues.append(mutableIt.maxValue())
}

应该注意,这将创建“it”结构实例的可变副本。

© www.soinside.com 2019 - 2024. All rights reserved.