Menu
Coddy logo textTech

計算プロパティ

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
    }
}
challenge icon

チャレンジ

簡単

格納プロパティ 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)
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Swiftプレイグラウンド