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