この世でいちばんわかりやすいiPhoneアプリ開発のおはなし【計算プロパティとは】
構造体を知っていると、このページの理解が深まります。構造体については、こちらのページで説明しています。
最新の値を返すプロパティ
ここでは、「本をどこまで読んだか」を追跡するプログラムを考えます。
まずは、本をモデル化します。 「全ページ数」と「読み終わったページ数」を追跡するプロパティがあれば、要件は達成できそうです。
struct Book {
let totalPages: Int
var inProgress = 0
}
全ページ数は、インスタンスの初期化時に指定できるようにします。 読み終わったページに関しては、大抵の場合に「最初は1ページも読んでいない」はずなので、既定値をゼロに設定します。
本のインスタンスを作成して、読書を進めてみましょう。
var myBook = Book(totalPages: 100)
myBook.inProgress += 5
上のコードは、全部で100ページの本を、5ページだけ読み進めたことを示しています。
さて、この時点で「残りのページ数」はいくつでしょうか? コードで計算します。
myBook.totalPages - myBook.inProgress // 95
上のコードが示す通り、残りのページ数は常に「全ページ数 - 読み終わったページ数」を計算することで取得できます。
型に計算プロパティという仕組みを導入することで、上記の計算を自動的に行うプロパティを定義することができます。 次のコードは、Book型に「残りのページ数」を示す変数の計算プロパティを定義します。
struct Book {
let totalPages: Int
var inProgress = 0
var remaining: Int {
get {
return self.totalPages - self.inProgress
}
}
}
計算プロパティを実装するには、型アノテーションの直後に波括弧{}でコードブロックを作成します。 そのコードブロックの中に作成したget節で、実行したい手続きを記述できます。 get節は、その計算プロパティを呼び出した側にreturnステートメントの値を返します。
「残りのページ数」を示す計算プロパティを参照すると、先ほどの計算式と同じ値を取得できます。
myBook.totalPages - myBook.inProgress // 95
myBook.remaining // 95
ページをさらに読み進めれば、「残りのページ数」も参照したタイミングで自動的に再計算されます。
myBook.inProgress += 10
myBook.remaining // 85
上のコードは、さらに10ページだけ読み進めたので、残りが85ページになったことを示しています。計算プロパティを使って、インスタンスから最新の値を取得できまるようになりました。
「残りのページ数」から「どこまで読み進めたか」を逆算することもできます。 例えば、残りが3ページになったら、「97ページまで読み終わっている」ことになります。
計算プロパティに新しい値を設定するには、set節を追加します。 set節では、「全ページ数 - 新しい残りのページ数」を計算した値で「読み終わったページ」を更新します。
struct Book {
let totalPages: Int
var inProgress = 0
var remaining: Int {
get {
return self.totalPages - self.inProgress
}
set {
self.inProgress = self.totalPages - newValue
}
}
}
set節では、計算プロパティに設定した「新しい値」をnewValueという名前で参照できます。
次のコードは、残りが3ページになって、97ページまでを読み終えたことを示しています。
myBook.remaining = 3
myBook.inProgress // 97
計算プロパティのget節を特に ゲッター といいます。 同様に、set節を セッター といいます。
合わせて読もう
構造体では計算プロパティを「型に備わるデータ」として定義することもできます。型プロパティについては、こちらのページで解説しています。