初回のみ実行(lazy, static)

lazyの主な特徴と利点

Swiftにおけるlazyキーワードは、遅延初期化(lazy initialization)を実現するための修飾子です。これは、プロパティが最初にアクセスされた時点で初めて初期化されるように動作を遅らせる機能です。 

  • 初期化の遅延: オブジェクトが作成される際ではなく、そのプロパティが実際に使用されるまで初期化コードの実行を延期します。
  • パフォーマンスの向上: 初期化に時間やメモリを多く消費する(計算コストが高い、大きなデータ構造を持つなど)プロパティがある場合、アプリの起動時やオブジェクト生成時のパフォーマンスを向上させることができます。
  • リソースの節約: 特定の条件下でのみ使用される可能性があるプロパティの場合、全く使用されなければ初期化自体が行われないため、不要なメモリ消費を防げます。
  • selfの使用: 通常のプロパティ初期化では、初期化が完了する前にself(自身のインスタンス)を参照できませんが、lazyプロパティの初期化クロージャ内ではselfを参照できます。 

使用上の制限

  • lazy常にvar(変数)にしか使用できません。値が初期化後に変更される可能性があるためです。
  • lazyプロパティはスレッドセーフ(thread-safe)ではありません。複数のスレッドから同時に初めてアクセスされた場合、初期化処理が複数回実行される保証はないため、注意が必要です。 

具体的な使用例

計算コストの高いプロパティや、初期化時に他のプロパティを参照する必要がある場合に特に有効です。 

Swiftのlazyプロパティは、必要になるまでコストのかかる処理を遅らせることで、より効率的なアプリ開発を可能にします。

SwiftUIでの主な使いどころ

SwiftUIでは、主にView構造体内のプロパティや、ObservableObjectなどのモデルクラス内で利用されます。

1. 計算コストの高いビューモデルのプロパティ

もしビューモデル(ObservableObject)が非常に重い計算結果をキャッシュする場合、lazyが役立ちます。

2. View構造体内の補助的なデータやインスタンス

SwiftUIのViewは軽量であるべきで、頻繁に再生成されます。もしビューの構築に直接関わらないが、ビュー内で必要になる補助的な大きなデータ構造やヘルパーインスタンスがある場合、lazyで遅延ロードさせることができます。

SwiftUI特有の注意点

  • @State@ObservedObjectとの組み合わせlazyは標準のSwiftプロパティ修飾子であり、@Stateや他のSwiftUIのプロパティラッパー(Property Wrapper)と直接組み合わせることはできません。プロパティラッパー自身が既に内部的な値の管理メカニズムを持っているためです。
  • ビューの再計算: SwiftUIのView構造体は値型であり、状態が変更されるたびにbodyが再計算(再構築)されます。lazyプロパティはインスタンスに紐づくため、ビューインスタンス自体が破棄されて新しいものに置き換わると、lazyプロパティもリセットされ、次回アクセス時に再度初期化されます。この挙動を理解しておく必要があります。

static

グローバル変数または静的プロパティの遅延初期化

Swiftでは、グローバル変数や静的プロパティ(static)の初期化は自動的にスレッドセーフで、かつ一度だけ実行されることが保証されています。シングルトンパターンの実装などで非常に役立ちます。

コメント

タイトルとURLをコピーしました