声明重载+ =运算符变异?

时间:2016-08-16 01:34:57

标签: swift operator-overloading swift3

我正在重载(或者可能在这种情况下实现)一个类的+ =运算符(不是结构!)。该操作修改左侧实例的状态。我注意到我可以用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 

1 个答案:

答案 0 :(得分:1)

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

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

然而,它并不保证该对象成员的恒定性。存在用于对不断变化的数据进行建模的类/对象,将变换标记为方法有点单调乏味,因为最终它们应该是他们应该做的事情。

在你想要受控变异的情况下,你应该使用结构。