标记关闭元素可变的Swift

时间:2019-03-13 21:45:35

标签: swift

我有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
    }
}

上面的代码无法编译,因为结构maxValues的方法CharData出错。它说Cannot use mutating member on immutable value: 'it' is a 'let' constant

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

2 个答案:

答案 0 :(得分:1)

forEach中的it参数/对象是不可变的。就像错误说:“这是让”。您可能可以执行以下操作:

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

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

答案 1 :(得分:1)

由于线是普通数组,因此简单:

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

也许不像Swifty,但是没有任何东西被复制。优化程序应该为您提供与forEach几乎相同的性能。