🍉

コンピューテッドプロパティとプロパティラッパーの違いを備忘録としてまとめてみた

2024/07/19に公開

プロパティラッパーとコンピューテッドプロパティの違いが気になって調べたので、備忘録としてまとめてみました。間違ってたらご指摘ください m(__)m

この違いについて調べた理由は、ある入力に対して、計算をして出力する点はどちらも同じでは?と思ったからです。違いとしてはそもそもの役割が違ってるみたいです。

違い

プロパティラッパー コンピューテッドプロパティ
データの保存方法を定義する仕組み データをその場で計算して返すプロパティ

プロパティラッパー(Property Wrapper)

プロパティラッパーは、プロパティの振る舞いを再利用可能な方法で定義するための仕組みです。プロパティラッパーを使用することで、プロパティの読み取りや書き込みの際に共通のロジックを適用できます。プロパティラッパーは、主にデータの検証、フォーマットの変換、キャッシュの管理などに使用されます。

import Foundation

@propertyWrapper
struct Uppercased {
    private var value: String = ""
    
    var wrappedValue: String {
        get { value }
        set { value = newValue.uppercased() }
    }
    
    init(wrappedValue: String) {
        self.wrappedValue = wrappedValue
    }
}

struct Person {
    @Uppercased var name: String
}

var person = Person(name: "nekori bocchi")
print(person.name) //出力: NEKORI BOCCHI

person.name = "toramaru sensei"
print(person.name) //出力: TORAMARU SENSEI

コンピューテッドプロパティ(Computed Property)

一方、コンピューテッドプロパティは、プロパティの値を計算して返すもので、そのクラスや構造体内で動作します。コンピューテッドプロパティは、通常のプロパティのように見えますが、実際には値を格納せず、その場で計算を行います。

import Foundation

struct Circle {
    var radius: Double
    
    // Computed property
    var area: Double {
        return .pi * radius * radius
    }
}

let myCircle = Circle(radius: 5.0)
print("Area of the circle: \(myCircle.area)") // Area of the circle: 78.53981633974483

まとめ

プロパティラッパーはプロパティの構造を定義し、一貫した変換を適用するために使用されます。一方、コンピューテッドプロパティは、プロパティの値をその場で計算して返します。

Discussion