【问题标题】:Declare overloaded += operator as mutating?将重载的 += 运算符声明为变异?
【发布时间】:2016-08-16 01:34:57
【问题描述】:

我正在重载(或者在这种情况下可能实现)一个类(不是结构!)的 += 运算符。该操作修改左侧实例的状态。我注意到我可以使用let 声明左侧元素而不会出现任何错误(并且由于它是类的实例,因此它的内部状态会随着操作而变化)。这当然是不希望的,并且应该导致编译时错误。有没有办法将重载的运算符声明为左侧元素的变异?

class MyClass {
    static func +=(lhs: MyClass, rhs: MyClass) {
        lhs.fu(rhs) // fu() changes internal state of lhs
    }
}

let a = MyClass()
let b = MyClass()

a += b // this is legal but shouldn't be, since instance 'a' will 
       // have a different internal state after the concatenation 

【问题讨论】:

    标签: swift operator-overloading swift3


    【解决方案1】:

    在这种情况下,let 常量是对它所指向的 MyClass 对象的引用 a。它会阻止您执行此操作:

    let a = MyClass()
    a = MyClass() //redefinition not allowed
    

    但是,它不保证该对象的成员的恒定性。类/对象的存在是为了对不断变化的数据进行建模,将方法标记为变异会有点乏味,因为总的来说,这就是它们应该做的事情。

    您应该在需要受控突变的情况下使用结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      相关资源
      最近更新 更多