2016-01-07 12 views
24

Ich habe gerade festgestellt, dass static Mitglieder von Swift structs sind implizit lazy.Implizit lazy statische Mitglieder in Swift

Zum Beispiel wird dies nur der Aufruf init einmal:

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

var z = Foo.bar 
z = Foo.bar 

Was ist die Logik dahinter?

Was ist, wenn ich das entgegengesetzte Verhalten möchte?

+5

Es gibt einige Gründe für die Wahl für globale Variablen, die hier faul sind: https://developer.apple.com/swift/blog/?id=7. Statische Mitglieder hätten vermutlich ähnliche Gründe, außer noch weniger Grund für die Initialisierung beim Start (ich meine, was ist, wenn Sie niemals einen Typ verwendet haben, wurde er nur über einen Import importiert? Sollten alle statischen Variablen unabhängig von der Verwendung initialisiert werden) ?) –

Antwort

39

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

Globale Konstanten und Variablen werden immer träge berechnet wird, in ähnlicher Weise wie Lazy Stored Properties. Im Gegensatz zu Lazy Stored Properties müssen globale Konstanten und Variablen nicht mit dem Modifikator lazy markiert werden.

Dieses implizit faul Verhalten ist, weil, wie die Swift Blog: Files and Initialization sagt:

es ermöglicht individueller initializers, Startzeit in Swift skaliert sauber ohne globalen initializers es zu verlangsamen, und die Reihenfolge der Ausführung ist völlig vorhersehbar.

Sie haben es bewusst so entworfen, um das Starten der App nicht unnötig zu verzögern.

Wenn Sie die static -Eigenschaft an einem bestimmten Punkt in Ihrer App instanziieren möchten (anstatt sie dorthin zu verschieben, wo sie zuerst verwendet wird), verweisen Sie einfach auf diese static-Eigenschaft an diesem früheren Punkt, und das Objekt wird zu diesem Zeitpunkt initialisiert. Angesichts der Anstrengungen, die wir unternommen haben, um die Latenz beim Starten unserer Apps zu reduzieren, möchten Sie dies im Allgemeinen beim ersten Start der App nicht synchron wünschen, aber Sie können es tun, wo immer Sie wollen.

+0

Im Beispiel "static let cache = NSCache()" wird der Cache beim Start initialisiert, oder nur wenn "Cache zuerst verwendet wird" ...? – Fattie

+0

Es ist faul. Ich habe meine Antwort aktualisiert, um diesen Punkt zu verdeutlichen. – Rob

Verwandte Themen