見出し画像

この世でいちばんわかりやすい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節を セッター といいます。

合わせて読もう

構造体では計算プロパティを「型に備わるデータ」として定義することもできます。型プロパティについては、こちらのページで解説しています。

いいなと思ったら応援しよう!