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にしていたら、width
やheight
が変更されても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は欠かせない機能です。ぜひ活用してみてください!