2016-01-07 20 views
24

スウィフトstructsのメンバーstaticが暗黙のうちにlazyであることに気がつきました。例えばSwiftの暗黙の静的メンバー

、これは一度だけinitを呼び出します:

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

var z = Foo.bar 
z = Foo.bar 

この背後にある論理的根拠は何?

逆の動作をしたい場合はどうすればよいですか?

+5

ここに怠けているグローバル変数の選択には、いくつかの根拠があります:https://developer.apple.com/swift/blog/?id=7。静的メンバーはおそらく同様の根拠を持っていますが、起動時の初期化の理由はそれほどありません(つまり、タイプを使用したことがない場合は、インポートによって取り込まれましたか? ?) –

答えて

39

プロパティは、「タイププロパティ」を定義します.1つは一度だけインスタンス化されます。注意しておきますが、静的な動作はグローバルのように動作するため、遅延が発生します。そして、The Swift Programming Language: Propertiesは次のように書いています:

グローバル定数と変数は、Lazy Stored Propertiesと同様の方法で遅延計算されます。遅延格納プロパティとは異なり、グローバル定数と変数には修飾子lazyを付ける必要はありません。

Swift Blog: Files and Initializationが言うように、これ暗黙的に怠惰な動作は次のとおりです。

を、それはスウィフトで起動時間がそれを遅くしていないグローバル初期化子できれいに拡大縮小、および実行の順序は、カスタムの初期化子を可能に完全に予測可能です。

彼らは意識的に、アプリケーションの起動を不必要に遅らせるのを避けるために設計しました。

staticプロパティを、アプリの特定の時点でインスタンス化する場合(最初に使用した場所に延期するのではなく)、この先のstaticプロパティを参照するだけで、その時点でオブジェクトが初期化されます。アプリを起動する際の待ち時間を短縮するために、アプリの最初の起動時には同期させるのが一般的ではありませんが、いつでもどこでも実行できます。

+0

"静的let cache = NSCache()"の例では、起動時にキャッシュが初期化されるか、または "キャッシュが最初に使用された"ときのみ...? – Fattie

+0

これは怠け者です。私はその点を明確にするために私の答えを更新しました。 – Rob

関連する問題