
前回[Swift入門#16]でも触れたイニシャライザについてもう少し書きたいと思います。
前回ではイニシャライザの初期値を設定しましたが、通常はインスタンスごとにデータを持たせて使います。
とりあえず例を見てみましょう!
class Staff {
let name: String
var salaryHour: Int
init() {
self.name = "まゆげじお"
self.salaryHour = 1250
}
}
前回と同じスタッフのデータを持たせたクラスを使います。
上記コードではイニシャライザ(init)の中身で初期値を設定していましたが、今回はインスタンスを生成する時に、値を設定してイニシャライザ(init)で受け取りたいと思います。
class Staff {
let name: String
var salaryHour: Int
init(name: String, salaryHour: Int) {
self.name = name
self.salaryHour = salaryHour
}
}
let mayugezio = Staff(name: "まゆげじお", salaryHour: 1250)
print(mayugezio.name)// 結果 まゆげじお
print(mayugezio.salaryHour)// 結果 1250
//新しいスタッフが入って来るたびにインスタンスを生成します。
let fuchan = Staff(name: "Fu-chan", salaryHour: 1100)
print(fuchan.name)// 結果 Fu-chan
print(fuchan.salaryHour)// 結果 1100
上記コードを詳しく見ていきたいと思います。
まずは10行目を見てみましょう!
ここでインスタンスを生成しています。
注目して欲しいのが、
Staff(name: “まゆげじお”, salaryHour: 1250)
この部分です。
インスタンス生成時に引数で値を渡していますね。
これをどこで受け取っているかと言うと、そうです!イニシャライザ(init)で受け取っています。
4行目で引数を受け取るコードを書いています。
5行目と6行目で受け取った値をそれぞれ代入しています。
12行目13行目でmayugezioのデータを呼び出しています!
流れとしてはこうなります。
インスタンスくん 『新しくバイトが入ったからデータを登録したよ〜イニシャライザさん受け取ってね〜』
イニシャライザさん 『オッケー!名前は「まゆげじお」で時給が「1250」だね!』
インスタンスくん 『ありがとう!確認できるようにプロパティーに代入しておいてね〜』
イニシャライザさん 『もちろん!確認する時はmayugezio.プロパティ名で呼び出してね〜!!』
おわかり頂けただろうか?
ちなみに新しくバイトが入ったら16行目のようにインスタンスを作っていけばOKですね!
イニシャライザはいくつでも指定する事ができます!
ただし同じ引数は使えませんので気を付けて下さいね!
では、インスタンス生成時に何も値が渡されなかった時の為に、イニシャライザをもう一つ作ってみます。
class Staff {
let name: String
var salaryHour: Int
init(name: String, salaryHour: Int) {
self.name = name
self.salaryHour = salaryHour
}
init() {
self.name = "研修中"
self.salaryHour = 1000
}
}
let dMatsuo = Staff()
print(dMatsuo.name)// 結果 研修中
print(dMatsuo.salaryHour)// 結果 1000
let dMatsuo = Staff(name: "D-mastuo", salaryHour: 1050)
print(dMatsuo.name)// 結果 D-mastuo
print(dMatsuo.salaryHour)// 結果 1050
新しいイニシャライザは8行目〜11行目です。
新しく入ったバイトが研修中は引数でデータを渡さず、初期値が設定されるようにしました。
これで研修中はみんな研修中と言う名前になって、時給も同じく1000とする事ができますね。
研修が終わったら18行目のようにデータを渡せばOKです!
class Staff {
let name: String
var salaryHour: Int
init(_ name: String, _ salaryHour: Int) {
self.name = name
self.salaryHour = salaryHour
}
init() {
self.name = "研修中"
self.salaryHour = 1000
}
}
let dMatsuo = Staff("D-mastuo", 1050)
print(dMatsuo.name)// 結果 D-mastuo
print(dMatsuo.salaryHour)// 結果 1050
こちらの記事でも触れていますが、引数を受け取る時のlabelをアンダーバーとする事で、呼び出す時に引数を省略して書く事ができます。
いかがでしたか?
ちょっと複雑になってきたかもですね。
クラスについての記事はまだまだ書く事があります( ̄▽ ̄)
いつも言ってる事ですが、とりあえず最初なので「こう言うのがあるんだ!」くらいで大丈夫です。
一通り勉強したら、とりあえずアプリを作ってみて必要になったらまたこの記事を読んでみて下さいね!
ありがとうございました!
[…] 今回追加したのが5行目の「peopleCountプロパティ」と12行目〜14行目の「getNumOfCountメソッド」です。どちらも文頭にstaticと記述されているのがわかると思います。クラスから直接呼び出すにはこれだけでOKです!ただこれだど新人が入って来ても1を足してくれないので、どこかで「peopleCountプロパティ」に1を足すコードを書かないといけませんね。「スタッフが新しく入る」=「インスタンスが生成される」と言う事なので、インスタンスが生成されるたびに、「peopleCountプロパティ」に1を足す事で解決するかと思います。インスタンスが生成されると必ず実行されるのがイニシャライザでしたね?イニシャライザについてはこちら→[Swift入門#17]クラス(イニシャライザ編)なのでイニシャライザの中で「peopleCountプロパティ」に1を足していきます。10行目がその記述ですが、イニシャライザはインスタンスから使うメソッドなので今回は、クラスから呼び出して「peopleCountプロパティ」1を足しています。では結果を見てましょう。クラスから直接「getNumOfCountメソッド」を呼び出しているのが17行目です。18行目でインスタンスを生成して、「peopleCountプロパティ」1を足しています。1足されたかを確認する為に19行目でもう一度「getNumOfCountメソッド」を呼び出しています。結果が「スタッフの人数は0人です」から「スタッフの人数は1人です」に変わってるのが確認できると思います。 […]