web-dev-qa-db-ja.com

Swiftの暗黙的な遅延静的メンバー

Swift staticstructsメンバーが暗黙的にlazyであることに気付きました。

たとえば、これはinitを1回だけ呼び出します。

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

var z = Foo.bar
z = Foo.bar

この背後にある理由は何ですか?

逆の動作が必要な場合はどうなりますか?

43
cfischer

staticプロパティは、「タイププロパティ」を定義します。これは、1回だけインスタンス化されます。ご指摘のように、これは静的にグローバルのように動作するため、遅延的に発生します。そして、 The Swift Programming Language:Properties のように:

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

この暗黙的な遅延動作は、 Swiftブログ:ファイルと初期化 が言うように、

これにより、カスタム初期化子、Swiftの起動時間は、グローバルな初期化子を使用せずにきれいにスケーリングできます。実行の順序は完全に予測可能です。

彼らは、アプリの起動を不必要に遅延させないように、そのように意図的に設計しました。

アプリの特定のポイントでstaticプロパティをインスタンス化する場合(最初に使用する場所まで延期するのではなく)、その前のポイントでこのstaticプロパティを参照するだけで、オブジェクトはその時点で初期化されます。アプリの起動時の遅延を減らすための努力を考えると、アプリの最初の起動時にこれを同期的に行うことは一般的に望まないでしょうが、好きな場所でそれを行うことができます。

81
Rob