web-dev-qa-db-de.com

Implizit faule statische Member in Swift

Ich habe gerade bemerkt, dass static Mitglieder von Swift structs implizit lazy sind.

Zum Beispiel wird das init nur einmal aufgerufen:

class Baz {
    init(){
        print("initializing a Baz")
    }
}
struct Foo {
    static let bar = Baz()
}

var z = Foo.bar
z = Foo.bar

Was ist das Grundprinzip dahinter?

Was ist, wenn ich das Gegenteil will?

43
cfischer

Die Eigenschaft static definiert eine "type-Eigenschaft", die nur einmal instanziiert wird. Wie Sie bemerken, geschieht dies träge, da sich die Statik wie global verhält. Und als Die Swift Programming Language: Properties sagt:

Globale Konstanten und Variablen werden immer träge berechnet, ähnlich wie Lazy Stored Properties . Im Gegensatz zu verzögert gespeicherten Eigenschaften müssen globale Konstanten und Variablen nicht mit dem Modifikator lazy markiert werden.

Dieses implizit faule Verhalten liegt daran, dass, wie im Swift Blog: Files and Initialization heißt:

benutzerdefinierte Initialisierungen sind möglich. Die Startzeit in Swift skaliert sauber, ohne dass globale Initialisierungen dies verlangsamen. Die Ausführungsreihenfolge ist vollständig vorhersehbar.

Sie haben es bewusst so gestaltet, dass der Start der App nicht unnötig verzögert wird.

Wenn Sie die static -Eigenschaft an einem bestimmten Punkt in Ihrer App instanziieren möchten (anstatt sie an den Ort zu verschieben, an dem sie zum ersten Mal verwendet wird), verweisen Sie einfach auf diese static -Eigenschaft an diesem früheren Punkt, und das Objekt wird zu diesem Zeitpunkt initialisiert werden. Angesichts der Anstrengungen, die wir unternehmen, um die Latenz beim Starten unserer Apps zu verringern, möchten Sie dies im Allgemeinen nicht synchron beim ersten Start der App, sondern können es tun, wo immer Sie möchten.

81
Rob