しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

【Swift】ImplicitlyUnwrappedOptionalなlazyの不思議な挙動

ImplicitlyUnwrappedOptionalなlazyが不思議な挙動をしたので調べてみました。
問題の挙動は以下の通りです。
変数にnilを入れたのに変数を参照しようとすると初期化処理が走りました。

class MyClass {
    lazy var value: Int! = {
        print("In Lazy") // → 2回printされる
        return 1
    }()
}

let c = MyClass()
print(c.value)
value = nil
print(c.value) // 1が入ってる

Optionalの場合は普通にnilが入ります。

class MyClass {
    lazy var value: Int? = {
        print("In Lazy")
        return 1
    }()
}

let c = MyClass()
print(c.value)
value = nil
print(c.value) // nilが入ってる

調べてみたら1年位までから言われていた挙動のようです。

Lazy stored propertyについて発表しました #関モバ - yashigani?.days