計算プロパティ
CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 12/57。
格納プロパティは値を保持します。計算プロパティにはストレージがありません。読み取られるたびにコードを実行し、他のプロパティから計算した値を返します。
struct Rectangle {
var width: Double
var height: Double
var area: Double {
width * height
}
}
var r = Rectangle(width: 3, height: 4)
print(r.area)
r.width = 10
print(r.area)出力:
12.0
40.0値は読み取るたびに再計算されるため、computed property が古くなることは決してありません。括弧を付けずに、stored property と同じように読み取ります。
struct Person {
var first: String
var last: String
var fullName: String {
"\(first) \(last)"
}
}
var p = Person(first: "Ada", last: "Byron")
p.last = "Lovelace"
print(p.fullName)出力:
Ada Lovelace計算プロパティにはセッターを持たせることもできます。setは新しい値をnewValueとして受け取り、それが基になっている格納プロパティを更新します。
struct Temperature {
var celsius: Double
var fahrenheit: Double {
get { celsius * 9 / 5 + 32 }
set { celsius = (newValue - 32) * 5 / 9 }
}
}
var t = Temperature(celsius: 100)
print(t.fahrenheit)
t.fahrenheit = 32
print(t.celsius)出力:
212.0
0.0他の値から導出され、計算コストが低い値には計算プロパティを使用します。処理に引数が必要な場合や、計算コストが高い場合はメソッドを使用します:
struct Order {
var items: [Int]
var total: Int { items.reduce(0, +) } // プロパティ: 引数なし
func total(withTax rate: Int) -> Int { // メソッド: 引数を取る
total + total * rate / 100
}
}チャレンジ
簡単格納プロパティ radius と、読み取り専用の計算プロパティ3つを持つように構造体 Circle を完成させてください。計算プロパティは、diameter(半径の2倍)、area(Double.pi を使用した π r²)、および label です。label は、面積を String(format: "%.2f", area) を使って小数点以下2桁に丸めた r=2.0 d=4.0 a=12.57 を返します。
提供されたコードは1行ごとに半径を読み取り、Circle を作成して label を出力します。その後、最後の円の半径を2倍にして、もう一度その label を出力するため、各値は半径に従って変化する必要があります。
コードは Circle.swift に記述してください。main.swift には提供された入出力コードが含まれており、編集できません。
自分で試してみよう
import Foundation
// 提供された入出力コード: そのままにしておく
var input: [String] = []
while let line = readLine() { input.append(line) }
var last = Circle(radius: 0)
for line in input {
last = Circle(radius: Double(line)!)
print(last.label)
}
last.radius *= 2
print(last.label)
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Swiftプレイグラウンド