2016-08-16 4 views
0

Ich überladen (oder vielleicht in diesem Fall implementieren) den Operator + = für eine Klasse (keine Struktur!). Die Operation ändert den Status der Instanz auf der linken Seite. Ich habe bemerkt, dass ich das linksseitige Element mit let ohne Fehler deklarieren kann (und da es sich um eine Instanz einer Klasse handelt, ändert sich ihr interner Zustand mit der Operation). Dies ist natürlich unerwünscht und sollte zu einem Kompilierzeitfehler führen. Gibt es eine Möglichkeit, den überladenen Operator für das Element auf der linken Seite zu mutieren?Überladenen + = Operator als mutieren deklarieren?

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 

Antwort

1

Die let Konstante in diesem Fall ist die Referenz a zum MyClass Objekt, das er auf Punkte an. Es verhindert, dass Sie in der Lage, dies zu tun:

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

Es ist nicht jedoch nichts über die Konstanz der Elemente dieses Objekts gewährleisten. Klassen/Objekte existieren, um sich ständig ändernde Daten zu modellieren, Markiermethoden als Mutationen wären ein wenig mühsam, weil sie das im Grunde genommen tun sollten.

Sie sollten Strukturen in Fällen verwenden, in denen Sie eine kontrollierte Mutation wünschen.

Verwandte Themen