我有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
我想要的是,遍历一行行,在其中的最大值找到更大的值。
答案 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几乎相同的性能。