2016-08-02 2 views
2

swiftの静的プロパティは遅延して初期化されます。私はクラスの静的プロパティを単体テストの際に簡単に置き換えることができる依存関係として使いたいと思っていました。プロパティの値はすぐにクロージャーが呼び出されましたが、プロパティーを読み取らずにそのプロパティーを置き換えると、このクロージャーは決して実行されません。代入時に静的プロパティのクロージャが実行されるのはなぜですか?

しかし、静的プロパティを設定すると、元のクロージャが実行されます。遅延インスタンスプロパティの場合はそうではありません。何故ですか?

問題を説明するために、私はサンプルコードを提供しました。

このコードの出力:

class Foo { 
    static var bar1: String = { 
     print("here we are") 
     return "This is static bar" 
    }() 

    lazy var bar2: String = { 
     print("here we are too") 
     return "This is instance bar" 
    }() 
} 

let foo = Foo() 
print("We have a Foo instance") 
Foo.bar1 = "Overwritten bar 1" 
print(Foo.bar1) 
foo.bar2 = "Overwritten bar 2" 
print(foo.bar2) 

である:ただし、静的プロパティを設定する際に

We have a Foo instance 
here we are 
Overwritten bar 1 
Overwritten bar 2 
+0

インスタンスの初期化では発生しないことを示すコードが更新されました。また、クロージャにブレークポイントを置き、スタックトレースを見ることで確認できます。 –

答えて

1

、元の閉鎖が実行されます。遅延インスタンスプロパティの場合はそうではありません。何故ですか?

どのような回答があなたを満足させるでしょうか?あなたは誰かにAppleの心を読ませるように頼んでいますか?あなたは誰と同じようにSwiftのソースコードを読むことができるので、それを読んでそれが何をしているかを見てください。個人的には、私はあなたの期待に同意します。私の意見では、この動作はバグであり、Appleにバグレポートを提出しました。あなたが同意する場合は、1つも提出してください。しかし、私があなたであれば何も変わることはないと思います。とにかく、あなたの質問は、Stack Overflowには適していない意見にのみ訴えることができます。あなたは好奇心旺盛だ場合

、私のバグレポートは、部分的に、番号19085421で、かつ読み:

概要:VARが書かれている 場合怠惰VARの初期化子は全く評価されるべきではありません最初に読まれることなく。しかし、それは グローバル変数がすることです。

再現手順:添付のプロジェクトを実行します。

予想される結果: の誰かがその値を読み取る前に、グローバル変数に割り当てています。したがって、私はそのイニシャライザがと決して と評価されることを期待しています。

実績: コンソールでログを証明しているようその初期化子は、評価さです。これは、ある程度、怠惰の目的を打ち破るものです。

+0

ねえ、バグレポート情報ありがとう!私はこれがバグであるかどうか分からなかった、私はちょうど私が何かを得ていないと思った、そして、なぜそれが起こっているのかという良い理由がある。 –

関連する問題