Swift キャプチャリストについてのメモ

続いてキャプチャリストについて

キャプチャリストを使うと、クロージャ内での参照型のオブジェクトのキャプチャルールを定義することができる、とのこと。

以下のような場合循環参照が発生するみたいです。

// self.xxx は 強参照するので、Hoge のインスタンス生成後、インスタンス = nil としてインスタンスからの参照を消してもクロージャからキャプチャされた強参照が残ってしまう。そのため解放されない問題が起きる
class Hoge {
    var hello: String = "Hello"

    lazy var helloWorld:() -> String = {
        self.hello + " World";
    }
}

これに対し、[unowned self] を付与することで強参照しないようにすることができます

    lazy var helloWorld2:() -> String = {
        [unowned self] in return self.hello + " World";
    }

なお、例中の lazy は初期化のタイミングを遅らせる場合に利用するものです。 lazy の指定がない場合、クロージャ内では self 識別子を使うことができません。

勉強させてもらったサイト