Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

posted at

アクセスするまで初期化を遅延させるlazyプロパティとは

はじめに

最近、開発している時に使用する部分が出てきたので備忘録としてまとめます。

lazyプロパティ

タイトルにもあるようにアクセスするまで初期化を遅延させるプロパティです。

コードで表すとこんな感じ。

lazy var hoge: Hoge

varの前にlazyを付けることで初期化を遅らせることが出来ます。

どのような動きをするのか確認してみましょう。

class Hogehoge {
    var hoge: Int = {
        print("hogeの値を生成します")
        return 1
    }()

    lazy var fuga: Int = {
        print("fugaの値を生成します")
        return 2
    }()
}

var hogehoge = Hogehoge()
print("Hogehogeクラスをインスタンス化しました")
print("hogeの値は\(hogehoge.hoge)です")
print("fugaの値は\(hogehoge.fuga)です")

// =======実行結果========
// hogeの値を生成します
// Hogehogeクラスをインスタンス化しました
// hogeの値は1です
// fugaの値を生成します
// fugaの値は2です

上記のコードを実行してみると通常のストアドプロパティ( hoge )の場合
インスタンス化した時に初期化が行われています。

対してlazyプロパティ( fuga )の場合はアクセス時に初期化が行われています。

この事から、lazyプロパティはアクセスするまで初期化を遅延させていることが分かりますね。

初期化時に他のプロパティやメソッドを利用できる

通常のストアドプロパティは、初期化時に他のプロパティやメソッドを利用することが出来ませんが
lazyプロパティの場合だと利用可能です。

実際にコードで検証してみましょう。

class Hogehoge {
    var hoge: Int = {
        print("hogeの値を生成します")
        return 10
    }()

    lazy var fuga = getValue(value: hoge)

    func getValue(value: Int) -> Int {
        print("今から計算します")
        return value * 2
    }
}

var hogehoge = Hogehoge()
print("Hogehogeクラスをインスタンス化しました")
print("fugaの値は\(hogehoge.fuga)です")

// =======実行結果========
// hogeの値を生成します
// Hogehogeクラスをインスタンス化しました
// 今から計算します
// fugaの値は20です

まず、hogeプロパティの値が生成されます。

そして、その後にHogehogeクラスのインスタンスが生成されて
そのインスタンスのfugaプロパティにアクセスします。

このアクセス時にfugaプロパティの初期化が行われて
それと同時にメソッドが呼ばれるため、初期化時に利用可能という訳です。

結果、fugaプロパティの値は20になりました。

どのような場面で使えばいいのか?

色々、調べていくと

初期値がインスタンス生成後の状態(他のプロパティなど)に依存している
セットアップが複雑で重く、使われるまでは生成する必要がない

この上記のような場面で使うことが推奨されていました。

こちらの記事で詳しく説明されています↓
【Swift4.1】lazyプロパティの使い所
【Swift】Lazyプロパティの使い方に気をつける(ドキュメントの確認は大事)
Swiftでlazyの使い方を復習してみる

おわりに

アクセスされるまで初期化されないので、不要なメモリの消費を防ぐことにも繋がります。

ちゃんと理解して使い分けれるようになりたいですね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?