我有一个包装 a 的结构var data:[T]
,它还提供有关内部数组的一些统计信息。一个统计数据是最大值,这可能是一项昂贵的操作,因为它需要搜索每个元素以确定最大值——所以我想缓存最大值并仅在需要时重新计算它:
private mutating func getMax()->T? {
if let m=maxValue {
return m
}
else if data.count>0 {
maxValue=data.maxElement()
return maxValue
}
else {
return nil
}
}
这似乎作为一种方法工作得很好,但我不知道如何做与计算属性相同的事情。
var max:T? {return getMax()}
导致抱怨需要将访问器标记为“变异”,因为 getMax() 正在变异(实际上我会将 getMax 代码放入属性访问器中,但这里不重写代码更容易)。
Xcode 建议我这样重写代码:
var max:T? mutating {return getMax()}
然后标记另一个问题,Xcode 建议在变异之前放置一个分号,这导致建议在变异之后放置另一个分号,然后在变异之后再放置一个分号,很明显编译器甚至没有试图提供帮助,只是有一个分号迷信。
有没有办法编写一个允许缓存值的计算属性,还是我坚持把它写成一种方法?