Warum ruft 'didset' eine Eigenschaft auf, wenn ich die Eigenschaft dieser Eigenschaft festlege?

8

In diesem Code wird, wenn sich der Text ändert, titleEditingChanged (wie erwartet) aufgerufen. Aber wenn es die Zeile ausführt

%Vor%

ruft die didset{} von Investment auf. Warum?

%Vor%     
ziggyzoggy 08.03.2016, 15:23
quelle

2 Antworten

7

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.

    
Jorg B Jorge 08.03.2016, 16:37
quelle
12

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.

    
dfri 08.03.2016 15:55
quelle

Tags und Links