swift计算属性getter可以改变结构吗?

时间:2016-07-06 20:43:42

标签: swift computed-properties

我有一个包裹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建议在变异之前加一个分号,这会导致建议在变异后再添加一个分号,然后在变异后再添加一个分号,很明显编译器甚至没有尝试帮助,但只是一个分号迷信。

有没有办法写一个允许缓存值的计算属性,还是我坚持把它写成一个方法?

1 个答案:

答案 0 :(得分:10)

尽管有编译器的建议,但正确的语法是:

var max:T? {
    mutating get {return getMax()}
}