
今回は計算プロパティについて書きます!
プロパティを設定する時に計算式を書いておく事で、他のプロパティなどの値を元に計算させて代入させる事ができます。
この説明ではちょっとわからないと思うのでとりあえずコードを見てみましょう!
class Staff {
let name: String //バイトの名前
var salaryHour: Int //時給
var worked: Int //働いた時間
var salaryDay: Int //日給
init(_ name: String, _ salaryHour: Int, _ worked: Int, _ salaryDay: Int) {
self.name = name
self.salaryHour = salaryHour
self.worked = worked
self.salaryDay = salaryDay
}
}
let mayugezio = Staff("まゆげじお", 1250, 8, 10000)//インスタンス生成
print(mayugezio.name) //結果 まゆげじお(名前)
print(mayugezio.salaryHour) //結果 1250(時給)
print(mayugezio.worked) //結果 8(働いた時間)
print(mayugezio.salaryDay) //結果 10000(日給)
mayugezio.worked = 4
print(mayugezio.worked) //結果 4(働いた時間)
print(mayugezio.salaryDay) //結果 10000(日給)
今回新しく追加したプロパティーは、働いた時間のデータを持たせた「workedプロパティ」と日給のデータを持たせた「salaryDayプロパティ」です。
ちょっとプロパティが増えて来たのでプロパティの役割をコード上に書いておきました〜!
上記コードは計算プロパティはまだ使っていないコードです。
15行目のインスタンス生成の時に、名前、時給、働いた時間、日給のデータを渡しています。
18行目〜21行目がそれぞれ出力した結果です。
意図した通りのデータが出力されていると思います。
次に23行目で、働いた時間を4時間に変更してみました。
25行目の結果はもちろん4になりますね。
でも時間を変更したのに26行目の日給は10000のままですね。
データを書き換えていないので当然ですが、このままでは働いた時間を変更したら日給まで変更しないといけないので、とてもめんどくさいですね!
そこで登場するのが計算プロパティです!
今回は「workedプロパティ」(働いた時間)を元に日給を計算して「salaryDayプロパティ」に代入させる処理をしたいと思います。
class Staff {
let name: String //バイトの名前
var salaryHour: Int //時給
var worked: Int //働いた時間
var salaryDay: Int { //日給
get {
return Int(salaryHour * worked) //ここで値を取得
}
}
init(_ name: String, _ salaryHour: Int, _ worked: Int) {
self.name = name
self.salaryHour = salaryHour
self.worked = worked
}
}
let mayugezio = Staff("まゆげじお", 1250, 8)//インスタンス生成
print(mayugezio.salaryDay) //結果 10000(日給)
mayugezio.worked = 4 //働いた時間を4時間に変更
print(mayugezio.salaryDay) //結果 5000(日給)
早速ですが上記コードを説明していきたいと思います!
計算プロパティの部分は5行目から9行目までです!
4行目のvar salaryDay: Intまでは他のプロパティと書き方は同じですね。
そこから { } の中に計算させたい処理を書いていきます!
注目ポイントは6行目のgetです。
ここの中で計算した値が「salaryDayプロパティ」に代入されます。
今回は「salaryHourプロパティ」と「workedプロパティ」をかけた値を「salaryDayプロパティ」に代入しています。
なので20行目の結果は8×1250なので10000になります。
では働い時間を変更してみましょう!
21行目で働いた時間を4時間に変更してみました!
22行目の結果を見るとちゃんと5000になっているのがわかると思います。
計算プロパティを使えばこのような処理が可能になります。
実は計算プロパティにはgetとsetがあります。
次はsetについて説明します!
では日給20000円もらうには何時間働けば良いのかを計算プロパティのsetを使って書いてみたいと思います。
では早速コードを見て見ましょう!
class Staff {
let name: String //バイトの名前
var salaryHour: Int //時給
var worked: Int //働いた時間
var salaryDay: Int { //日給
get {
return Int(salaryHour * worked) //ここで値を取得
}
set {
worked = newValue / salaryHour //ここで値をセット
}
}
init(_ name: String, _ salaryHour: Int, _ worked: Int) {
self.name = name
self.salaryHour = salaryHour
self.worked = worked
}
}
let mayugezio = Staff("まゆげじお", 1250, 8)//インスタンス生成
print(mayugezio.salaryDay) //結果 10000(日給)
mayugezio.salaryDay = 20000 //ここでsalaryDayに20000を代入
print(mayugezio.worked) //結果 16
getでは、他のプロパティなど値を使い計算した値を「salaryHourプロパティ」代入していました。
setでは「salaryHourプロパティ」に値を入れて、その値を元に他のプロパティなどの値を書き換える事ができます。
まずは上記コードの9行目を見てみましょう。
わかりやすくsetと書いているのでここからがsetの処理だとわかると思います。
setの中を見るとなんらかの計算がされて、「workedプロパティ」に代入されていますね。
newValueと言うのが「salaryDayプロパティ」の値です。
なのでここでは、「salaryDayプロパティ」➗「salaryHourプロパティ」で働く時間を計算しています。
では24行目を見てみましょう!
「salaryDayプロパティ」が書き換えられています。
今回は20000円稼ぐには何時間働かないといけないかを知りたいので、20000に書き換えました。
するとこの値がnewValueに代入されて、計算して「workedプロパティ」に代入されます。
25行目の結果を見てみるとちゃんと16と表示されているのでOKですね。
setを書く必要がなかったら下記コードのように書けばgetを省略する事もできます。
var salaryDay: Int { //日給
return Int(salaryHour * worked) //ここで値を取得
}
僕的にはgetくらい省略せずに書けば良いんじゃないかなって思いますが、人の書いたコードを見た時に「なんだこれっ!」ってならないように省略できるんだって覚えておくと良いと思います〜!
[…] まずサブスクリプトを設定するとこう言う呼び出し方ができると言うのを確認したいので、11行目の結果から見てみましょう!要するに、 インスタンス名[インデックス番号] を指定してクラスの中の配列(今回で言うと2行目の配列)を呼び出せるようになります!ではサブスクリプトの部分を説明していきます。サブスクリプトの記述は3行目からですね。まずsubscriptと書いてあげます。次に インデックスに使う型と返り値の型 を指定します。今回だと、インデックスはIntで返り値はStringで指定しました。サブスクリプトの中の処理ですが、計算プロパティのようにgetとsetを使います。計算プロパティについてはこちら[Swift入門#18]クラス(計算プロパティ編)getとして{}の中にreturn menbers[index]と書いてあげればOKです! […]