【问题标题】:Swift: Implementing Comparable with computed struct propertySwift:使用计算结构属性实现 Comparable
【发布时间】:2019-04-01 12:41:17
【问题描述】:

我正在尝试在结构 Pitch 上实现可比较,该结构具有称为 value 的计算属性。计算属性被标记为“mutating get”,因为它需要修改此实例属性。但是,当我尝试扩展以使结构具有可比性时,返回行旁边出现错误:

不能对不可变值使用可变 getter:'lhs' 是一个 'let' 常量

  extension Pitch: Comparable {
    public static func < (lhs: Pitch, rhs: Pitch) -> Bool {
        return lhs.value < rhs.value
    }

知道如何解决这个问题吗?

【问题讨论】:

  • 为什么 getter 会发生变异?

标签: swift computed-properties


【解决方案1】:

主要是因为 Mutating 是改变 Object 内部变量的值。

lhs & rhs  // Are parameter.

并且参数在 Swift 中是不可变的(常量)。

因此,您可以将这些参数克隆到 var 类型的新对象中,并使用它们的可变 Value

因为它们的类型是Struct 值类型,所以你可以简单地说这个var newObj = myOldObj

您的代码可能是这样的。

public static func < (lhs: Pitch, rhs: Pitch) -> Bool {
    var lhsObj = lhs
    var rhsObj = rhs
    return lhsObj.value < rhsObj.value
}

【讨论】:

  • lhsrhs 的类型为 Pitch
  • @Carpsen90 编辑感谢:D 复制此案例时没有注意到
  • 感谢托比 - 这行得通。据推测,创建新的新对象应该是相当有效的,因为它们是结构。
猜你喜欢
  • 2018-08-24
  • 1970-01-01
  • 2012-07-28
  • 2014-12-28
  • 2016-09-04
  • 2019-02-14
  • 2020-03-15
  • 2016-04-22
  • 1970-01-01
相关资源
最近更新 更多