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?
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.