遅延初期化来たか。ということで、実験と応用を考えてみます。
lazyなし
class Sub {
init() {
println("initialized!!")
}
}
class foo {
var lazySub = {
Sub()
}()
}
コンソールには'initialized!!が2回出力される'
lazyあり
class Sub {
init() {
println("initialized!!")
}
}
class foo {
@lazy var lazySub = {
Sub()
}()
}
コンソールには'initialized!!'が一回だけ出力される
何をやっているか
class foo {
@lazy var lazySub = create()
func create() {
return Sub()
}
}
これを無名関数化 + 実行しているだけ。
どこで使えるか
@property lazySub
- (Sub *)lazySub {
if (_lazySub == nil) {
_lazySub = [Sub new];
}
return _lazySub;
}
こういうよく見るやつに使えるかなーと。
※このやり方だとクロージャ内でselfを使おうとするとエラーになる。。。原因調査中です。
追記
ちなみにこんなのをやってた記事を見たんですけど、普通に何回でも実行されるのになんで@lazyが書けるのか不明...
class foo {
@lazy var lazySub: () -> Sub = {
return Sub()
}
}
// 変数にクロージャをバインドしているが、当然呼べば呼ぶだけ実行される。