In diesem Code wird, wenn sich der Text ändert, titleEditingChanged
(wie erwartet) aufgerufen. Aber wenn es die Zeile ausführt
ruft die didset{}
von Investment
auf.
Warum?
Es heißt, weil Investment
wahrscheinlich eine Struktur ist, keine Klasse.
In Swift-Strukturen sind Werttypen, keine Referenztypen als Klassen.
Strukturen sind also nicht "veränderbar".
Dies bedeutet, dass jedes Mal, wenn Sie eine Struktureigenschaft ändern, ein neues Strukturobjekt dem aktuellen ersetzt wird, die aktuellen Objektdaten in das neue Objekt kopiert werden, mit Ausnahme der geänderten Eigenschaft, die den neuen Wert enthält.
Denken Sie daran, dass der Compiler Sie nicht erlaubt, eine Struktureigenschaft zu ändern, wenn Sie ein Strukturobjekt mit einem let
-Befehl initialisieren (mit einer Klasse, die Sie tun können).
Das erklärt, warum der Beobachter aufgerufen wird, wenn Sie eine Struktureigenschaft ändern. Sobald ein neues Strukturobjekt zugewiesen wurde, um das aktuelle zu ersetzen, wird es nun in einem anderen Speicherblock gespeichert, so dass sein Wert geändert wird und der didSet
Beobachter aufgerufen wird.
PS: Es wird nicht passieren, wenn Sie Investment
als Klasse anstelle einer Struktur definieren.
Eigenschaftsbeobachter von -Werttypen (z. B. Strukturen) werden auch aufgerufen, wenn eine zugrunde liegende Eigenschaft der Typinstanz gesetzt ist; einfach weil der -Wert der Instanz selbst aktualisiert wird . Dasselbe gilt nicht für Referenztypen ; Solange die Referenz selbst nicht mutiert ist, wird der Eigenschaftenbeobachter nicht aufgerufen (d. h. die Referenz selbst kann als der Wert von Referenztypen betrachtet werden).
Von Sprachführer - Eigenschaften - Objektbeobachter lesen wir:
Eigenschaftsbeobachter beobachten und reagieren auf Änderungen in einer Eigenschaft Wert Immobilienbeobachter werden jedes Mal aufgerufen, wenn der Wert einer Immobilie angegeben ist gesetzt, auch wenn der neue Wert dem aktuellen Wert der Eigenschaft entspricht
Betrachten Sie das folgende Beispiel, um das Obige zu überprüfen:
%Vor% Daraus können wir schließen, dass Ihr benutzerdefinierter Typ Investment
ein Werttyp (eine Struktur) und der didSet
-Eigenschaftsbeobachter der Instanz investment
dieses Typs (in Ihrer UITableViewCell
-Unterklasse) sein wird aufgerufen, auch wenn Sie nur die zugrunde liegenden Eigenschaften von investment
festlegen / aktualisieren. Wenn Sie dies vermeiden möchten, ändern Sie Investment
in einen Referenztyp (Klasse). In diesem Fall wird die didSet
-Eigenschaftsbeobachtung nur geändert, wenn die investment
-Instanz selbst festgelegt ist / aktualisiert.