こんにちは、「ふ」です。
Swiftにおける普通の変数。
当たり前に書いてますよね。
しかし技術書のコードなどを見ていると、こういうのが出てきます。
変数のあとに{ }で囲まれた処理が書いてある。これはなんぞや?
〜普段使っている変数や定数は「値」を直接格納する、stored(格納型)プロパティと呼ばれています。それに対して上に書いた変数は、computed(計算された)プロパティと呼ばれるものです。
computedプロパティは、自身は決まった値を持っておらず、他のプロパティの値を元に処理を行い結果を返す挙動をします。
今回はこのcomputedプロパティについて調べていきましょう。
computedプロパティには、 読み取り専用のgetメソッドと書き込み用のsetメソッドがあります。まずはgetメソッドのみのプロパティを作ってみましょう。
正方形についてのクラス「Square」を作ります。その中に一辺の長さを表す変数「side」を宣言しました。
computedプロパティ(getのみ)は次のように記述します。
クラス「Square」に面積を表す変数「area」を加えましょう。一辺の長さ「side」を元に値を返すよう、getメソッドを設定します。
Squareクラスのインスタンス「s1」を作り、プロパティの値を調べてみます。
「area」を出力するとgetメソッド「area*area」が実行されて返ってきます。
扨(さて)、getメソッドのみ定義したcomputedプロパティは「読み取り専用」となります。試しにインスタンスの外部から値を書き換えてみると・・
ちゃんとエラーとなってくれます。外部から変更されたくないプロパティを設定するときに使えそうですね。
次にsetメソッドを書き加えてみましょう。setメソッドは、クラスの中で(直下で)宣言されている変数(メンバ変数)に値をセットするメソッドです。
〜と言うとややこしく感じるかもですが、クラス「Square」のメンバ変数はこれですね。
このメンバ変数に値をセットするメソッド、setを書いていきます。記述の仕方は以下のようになります。
先ほどgetメソッドのみのcomputedプロパティを作りましたが、setメソッドは単独では使えません。必ずgetメソッドも定義するようにしましょう。
変数「area」にsetを追加してみます。
変数「area」の値を「引数*area」とする処理を記述しました。
getの時と同様、Squareのインスタンスを作り、内容を調べてみます。
???の方も多いと思います。s2.areaに「2」を代入したのに、s2.areaの値を呼び出すと「16」となるのです。内部で何が起きているのでしょうか。
1つ1つ見ていきましょう。
インスタンスを生成する、これは普通ですよね。
これは何をやっているのでしょうか。
そう、ここがsetメソッドを理解する上での1番の難解ポイントです。
これは、
という操作を行っているのです。
ちょっと特殊な記述方法にも思えますが、「s2.area」に外部から値を代入すると、setの引数にその値が指定されます。
するとそこでsetメソッドが実行され、メンバ変数「side」の値が置き換えられます。置き換えられた「side」の値を見てみましょう。
このあと「s2.area」を呼び出すと、書き換えられた「side」の値を元にsetメソッドが実行されてその値が返ってきます。
computedプロパティのsetとget、どちらを発動させるかは書き込み操作、読み取り操作をそれぞれ行う事で振り分けられます。
書き込み操作
s2に値を指定するとsetが発動してメンバ変数の値を操作する。
読み取り操作
s2を呼び出すとgetが発動し、変更されたメンバ変数を元に処理を行い値を返す。
computedプロパティのsetとgetの仕組み、お分かりいただけたでしょうか?
扨(さて)、computedプロパティは省略型で記述されていることもしばしばあります。最後によくある2つのパターンを紹介しておきますね。
◼︎その1。読み取り専用のプロパティの場合、「 get { } 」の括りを省略することができます。
この「area」の表記は、
と同じことになります。
◼︎その2。setメソッドの引数を記述しなかった場合、引数名は「newValue」となります。
ただしsetを記述したときは読み取り専用ではなくなるので、「 get { } 」の括りは省略せずに記述しましょう。
インスタンスを作って動きを確認してみます。
setメソッドの引数名は「newValue」として扱われている事が確認できます。
これら2つの省略型はよく登場するので、覚えておいたほうがよろしいかと。
如何でしたか?今回はcomputedプロパティについて紹介しました。長い記事になってしまいましたがお付き合いくださった方、ありがとうございます!
これでもう、変数の後ろに「 { } 」が付いたコードが出てきてもビビらなくてすみますね ♫
◼︎関連記事
swift、web、ガジェットなど。役立つ情報や観ていてたのしいページを書いていきたいと思います。
🐧 twitter 🐧