MENU

Swift入門:Computed Property(計算型プロパティ)を理解しよう

目次

Computed Property(計算型プロパティ)とは?

Computed Propertyは、値を保存せずに、必要なときに計算して値を返すプロパティです。

通常のプロパティ(Stored Property)は値をメモリに保存しますが、Computed Propertyは他のプロパティの値から動的に計算されます。

具体例で理解する

例1:長方形の面積を計算する

長方形のwidth(幅)とheight(高さ)から、面積を計算したい場合を考えてみましょう。

struct Rectangle {
    var width: Double   // Stored Property(値を保存)
    var height: Double  // Stored Property(値を保存)
    
    // Computed Property(計算して値を返す)
    var area: Double {
        return width * height
    }
}

let rect = Rectangle(width: 5.0, height: 10.0)
print(rect.area)  // 50.0

areaは値を保存していません。rect.areaにアクセスするたびに、その場でwidth * heightが計算されます。

なぜメソッドではなくComputed Propertyを使うのか?

同じことはメソッドでも実現できます:

// メソッドの場合
func calculateArea() -> Double {
    return width * height
}
print(rect.calculateArea())  // 50.0

しかし、Computed Propertyの方がより自然で読みやすいコードになります:

  • rect.area ← シンプルで直感的
  • rect.calculateArea() ← 少し冗長

面積は「計算する」というよりも「持っている属性」として扱う方が自然ですよね。

GetterとSetterを使いこなす

Computed Propertyは読み取りだけでなく、値の設定もできます。

例2:摂氏と華氏の温度変換

struct Temperature {
    var celsius: Double  // 摂氏温度を保存
    
    // 華氏温度はComputed Propertyとして定義
    var fahrenheit: Double {
        get {
            // 読み取り時:摂氏から華氏に変換
            return celsius * 9 / 5 + 32
        }
        set {
            // 設定時:華氏から摂氏に変換(newValueに設定値が入る)
            celsius = (newValue - 32) * 5 / 9
        }
    }
}

var temp = Temperature(celsius: 25.0)
print(temp.fahrenheit)  // 77.0

temp.fahrenheit = 86.0  // 華氏で設定
print(temp.celsius)     // 30.0(自動的に摂氏に変換される)

この例では:

  • celsiusだけがメモリに保存される
  • fahrenheitは必要に応じて計算される
  • どちらの単位でも設定できる

Read-Only Computed Property(読み取り専用)

Setterを省略すると、読み取り専用になります。さらにgetキーワードも省略できます:

struct Circle {
    var radius: Double
    
    // シンプルな書き方
    var diameter: Double {
        radius * 2
    }
    
    var circumference: Double {
        radius * 2 * Double.pi
    }
    
    var area: Double {
        radius * radius * Double.pi
    }
}

let circle = Circle(radius: 5.0)
print(circle.diameter)        // 10.0
print(circle.circumference)   // 31.41...
print(circle.area)           // 78.53...

Computed Propertyのメリット

1. データの整合性が保たれる

値が常に最新の状態で計算されます。

var rect = Rectangle(width: 5.0, height: 10.0)
print(rect.area)  // 50.0

rect.width = 8.0
print(rect.area)  // 80.0(自動的に再計算される)

もしareaをStored Propertyにしていたら、widthheightが変更されてもareaは古い値のままになってしまいます。

2. メモリの節約

導出できる値を保存する必要がないため、メモリを節約できます。

3. カプセル化の実現

内部の実装を隠蔽しながら、使いやすいインターフェースを提供できます。

struct Person {
    var firstName: String
    var lastName: String
    
    var fullName: String {
        "\(firstName) \(lastName)"
    }
}

let person = Person(firstName: "太郎", lastName: "山田")
print(person.fullName)  // 山田 太郎

注意点

1. 必ずvarで宣言

Computed Propertyは値が変わる可能性があるため、letでは宣言できません。

// これはエラー
let area: Double {  // ❌ エラー
    width * height
}

2. 計算コストを意識する

アクセスするたびに計算が実行されるため、重い処理には向きません。

// 重い計算の例
var expensiveCalculation: Double {
    // 複雑な計算処理...
    // 毎回実行されるので注意
}

頻繁にアクセスする重い計算は、Stored Propertyにキャッシュする方が良い場合もあります。

まとめ

Computed Propertyはこんな時に使おう:

  • 他のプロパティから導出できる値を扱う時
  • データの整合性を保ちたい時
  • コードを読みやすくしたい時
  • 単位変換などの双方向の変換が必要な時

Swiftでクリーンで保守しやすいコードを書くために、Computed Propertyは欠かせない機能です。ぜひ活用してみてください!

プログラミングの独学におすすめ
プログラミング言語の人気オンラインコース
独学でプログラミングを学習している方で、エラーなどが発生して効率よく勉強ができないと悩む方は多いはず。Udemyは、プロの講師が動画で実際のプログラムを動かしながら教えてくれるオンライン講座です。講座の価格は、セール期間中には専門書籍を1冊買うよりも安く済むことが多いです。新しく学びたいプログラミング言語がある方は、ぜひUdemyでオンライン講座を探してみてください。
目次