2016-08-16 2 views
0

Ich möchte klären, wenn ich das folgende Konzept richtig verstehe.Vorteil der berechneten Eigenschaften (nur gettes) gegen gespeicherte Eigenschaften

Angenommen, mein Ziel, die String"Good morning, Mike" in die Variable var sayGoodMorningToUser zu speichern ist.

ist die Zeichenfolge aus zwei Variablen zusammengesetzt, nämlich

var greeting = "Good morning, " 
var username = "Mike" 

Welchen Unterschied macht es mit anderen Worten, wenn ich gespeichert Eigenschaften verwenden vs. berechneten Eigenschaften:

var sayGoodMorningToUserStored = greeting + username 

vs.

var sayGoodMorningToUserComputed:String { 
    return greeting + username 
} 

Der einzige Unterschied, den ich zwischen diesen beiden Ansätzen sehe, ist, dass sich jeder ändern könnte der Wert von sayGoodMorningToUserStored einfach und direkt, z.B. von

var sayGoodMorningToUserStored = "myNewChangedValue" 

während die Variable Schreiben sayGoodMorningToUserComputed kann nicht direkt geändert werden, weil es nicht einfach auf einen neuen String-Wert eingestellt werden kann:

var sayGoodMorningToUserComputed = "Hallo" //this would cause an error 

Ansonsten kann ich nicht verstehen, warum die Leute die Variable anstatt einfach berechnen Schreiben

var sayGoodMorningToUserStored = greeting + username. 

Kann jemand erklären, wenn ich es richtig verstanden habe? Oder gibt es auch andere Vorteile von berechneten Variablen gegenüber gespeicherten?

Ich möchte meine Frage nur auf getable-Variablen beschränken, weil das Erörtern von einstellbaren Variablen hier den Rahmen sprengen würde.

+0

Der Zweck der berechneten Eigenschaft besteht darin, dass Sie sie einmal deklarieren, und wenn sich der 'Benutzername' ändert, wird die berechnete Eigenschaft" Begrüßung "automatisch aktualisiert, um dies zu berücksichtigen. Wenn sich der 'username' geändert hat, müssen Sie nicht daran denken,' sayGoodMorningToUserStored' ebenfalls zu aktualisieren. Wenn Sie es an anderer Stelle in Ihrem Code referenzieren, wird automatisch der aktuelle Wert von "Benutzername" und nicht der "Benutzername" angezeigt, wenn "sayGoodMorningToUserStored" zum ersten Mal deklariert wurde. – Rob

+0

Der Hauptunterschied, den ich mir gerade denken kann, ist mit Protokollen und Protokollerweiterungen. Bei Protokollen kann der Status nicht gehalten werden, daher ist ein berechneter Wert am besten. – jonmecer

+0

@Pisan Wenn Sie der Meinung sind, dass Ihre Frage erfüllt wurde, bewerten Sie bitte eine Frage als akzeptiert. – Alexander

Antwort

1

Computed Eigenschaften

var sayGoodMorningToUserComputed: String { 
    return greeting + username 
} 

sayGoodMorningToUserComputed wirkt wie eine Funktion. Wenn eine Änderung an greeting oder username vorgenommen wurde, gibt sayGoodMorningToUserComputed ein aktuelles Ergebnis zurück, das die Verkettung der aktuellen Werte darstellt.

Sie möchten dies verwenden, wenn Sie sicherstellen möchten, dass der zurückgegebene Wert aus den letzten Werten seiner Abhängigkeiten berechnet wird (greeting und username).

Im Fall, dass beide Abhängigkeiten final sind, dann ist es sehr wahrscheinlich, dass die Compiler diese berechnete Eigenschaft in eine gespeicherte Eigenschaft optimieren würden, weil es die Abhängigkeiten kennt nicht

Stored Eigenschaften

var sayGoodMorningToUserStored = greeting + username 
ändern

sayGoodMorningToUserStored ist nur eine Variable, mit nichts Besonderes. Es wird jedoch nur einmal festgelegt, wenn der enthaltende Bereich initialisiert wird. Es wird einmal berechnet, gespeichert und bleibt konstant, bis es von einer externen Quelle überschrieben wird. Wenn sich greeting oder username ändert, hat dies keine Auswirkung auf sayGoodMorningToUserStored, da es aus den alten Werten berechnet und gespeichert wurde.

Sie möchten dies verwenden, wenn Sie die Leistung verbessern möchten, indem Sie das Ergebnis einer Berechnung zwischenspeichern, deren Abhängigkeiten konstant sind.

+0

Gib diesem Mann ein verdammtes Häkchen. – ospahiu

2

Der Unterschied in Ihrem Beispiel ist dies:

var sayGoodMorningToUserStored = "myNewChangedValue" 

und

var sayGoodMorningToUserStored = greeting + username 

gesetzt werden, wenn die Klasse initialisiert wird, während dies:

var sayGoodMorningToUserComputed:String { 
    return greeting + username 
} 

jedes Mal, das ausgewertet wird Eigentum wird zugegriffen. Das einfache Beispiel ist eine Klasse, die firstName und lastName hat, aber auch wollen fullName. Unter Verwendung einer normalen Eigenschaft müssen Sie bei jeder Aktualisierung firstName oder lastName auch fullName aktualisieren, damit es übereinstimmt. Wenn Sie eine berechnete Eigenschaft verwenden, erhalten Sie bei jedem Zugriff auf fullName die aktuellen Informationen.

Verwandte Themen