【问题标题】:Can a swift computed property getter mutate a structure?快速计算的属性 getter 可以改变结构吗?
【发布时间】:2016-11-09 01:30:28
【问题描述】:

我有一个包装 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 建议在变异之前放置一个分号,这导致建议在变异之后放置另一个分号,然后在变异之后再放置一个分号,很明显编译器甚至没有试图提供帮助,只是有一个分号恋物癖。

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

【问题讨论】:

标签: swift computed-properties


【解决方案1】:

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

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

【讨论】:

  • 但是如果struct是一个常量,这会产生编译错误。因为常量结构的变量不能改变。
猜你喜欢
  • 2019-11-26
  • 2017-05-12
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 2017-09-29
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多