歴史的に、Objective-Cではプロパティはアクセスメソッド(ゲッターとセッター)を通じて実装されていました。Swiftでは、現在の値を「その場で」計算するプロパティを簡単に作成できるcomputed propertiesのための特別な構文が導入されました。これにより、タイプのカプセル化と表現力が拡張されます。
問題点: 特に値が他のプロパティに依存している場合や常に変化し続ける場合、結果をstored propertyとして保存するのは不便です。計算メソッドを使用すると、タイプのインターフェイスがあまり読みやすくなくなり、その本質が隠されてしまいます。
解決策: Computed propertyはgetと、必要に応じてsetを使用して定義されます。このようなプロパティにアクセスすると、メモリから読み取るのではなく計算が実行されます。これにより、オブジェクトの他の状態と自動的に同期した派生プロパティを構築することができます。
コードの例:
struct Rectangle { var width: Double var height: Double var area: Double { get { return width * height } set { // 新しいarea値に基づいてwidthを自動更新(例) width = sqrt(newValue / height) } } } var rect = Rectangle(width: 5, height: 2) print(rect.area) // 10 rect.area = 36 print(rect.width) // 3.0
主な特徴:
computed propertyでwillSet/didSetを使用できますか?
いいえ、willSetとdidSetはstored propertyにのみ適用されます。computed propertyでは、値が自動的に保存されないため、これらのオブザーバーは機能しません。
computed propertyはweakまたはimplicitly unwrappedタイプであることができますか?
はい、computed propertyはオプショナルまたは暗黙的にアンラップされたものにすることができます。ただし、計算のみであるため、これらのプロパティをweakにする意味はありません。
computed propertyでprivate setを使用するのはどのような場合が良いですか?
アクセス修飾子private(set)は、getとsetを持つcomputed propertyには適用できず、のみstored propertyに適用できます。computed propertyのsetは、private setを使用して完全にプライベートにすることができますが、これはsetブロックの可用性を通じて暗黙的に実現されます。
public var area: Double { private set { ... } get { ... } }
ゲットcomputed propertyが毎回ネットワークから大きなデータを取得し、アクセスするたびにフリーズやネットワークの過負荷を引き起こします。
長所:
短所:
Computed propertyは、他のstored propertyに基づいた最終的な値を最小限のコストで計算し、重いロジックのキャッシングを別のメカニズムに移しています。
長所:
短所: