はじめに
野良でコードをまねていたりすると、たまに構造体の中に出てくるinit( ) 。
調べてみるとどうやらイニシャライザーというものらしい。
使い方が全く分からない。てかいらなくない?と思ってしまった。
しかし、イニシャライザーを理解できていない = しっかり基礎が身についていないということに気づいてしまいました。。。
そこで今回は、イニシャライザーについて備忘録的にまとめていくことにします。
Swiftは勉強中ですので、間違えていましたら指摘いただけると幸いです。
目次
項番 | ページ内リンク |
---|---|
1 | イニシャライザーとは |
2 | どのような時に必要なのか |
3 | selfとは |
4 | まとめ |
1.イニシャライザーとは
結論から言うとイニシャライザーとは、 「構造体の初期設定を実行するメソッド」 です。
・・・???
わけわかんねぇよ。お腹すいたよ。
まずは落ち着いておにぎりを食べてください。
順番に説明していきます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
※ここまでで構造体、プロパティ、メソッド、インスタンスをはっきり理解できていない人は、まずはこの基礎を理解しましょう。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
2.どのような時に必要なのか
説明する前に以下のコードを理解してください。
struct ProfileSetting {
var name = "田中"
var hairColor = "黒"
func sayProfile() {
print("あなたのユーザ名は\(name)、髪の色は\(hairColor)です")
}
}
ゲームで初めにプロフィールを設定する場面を想像してください。
あなたの名前、髪の色など、様々な初期設定を冒険の前に設定しますよね?
この時、ゲーム制作者はゲームをするユーザの名前、髪の毛の色は分かりますでしょうか?
上記の場合、構造体ProfileSettingのプロパティnameには、"田中"が初めから格納されています。
ただ、ここは田中である必要はありません。
しかし、絶対に必要であるにもかかわらずユーザごとに設定が違うのでゲーム制作者は事前に設定することができません。
つまり以下のように書き替えることが可能です。
struct ProfileSetting {
var name: String
var hairColor: String
init(name: String, hairColor: String) {
self.name = name
self.hairColor = hairColor
}
func sayProfile() {
print("あなたのユーザ名は\(name)、髪の色は\(hairColor)です")
}
}
はい、出てきた init !
上記ではname, hairColorにはぞれぞれ何も代入されていません。
そのため初期設定としてメソッドのinitを使用し、それぞれにname, hairColorを代入しておくのです。
こうすることで、名前がまだない、いつでもなんでも代入できるname, hairColorが完成します。
通常、構造体を実体として呼び出すときにはインスタンスを使用すると思います。
今回の構造体ProfileSettingの場合は以下です。
var profileSetting = ProfileSetting(name: "田中", hairColor: "黒")
実はなんとなく、ProfileSettingをProfileSetting()と記載していますが、
ProfileSetting()というのは、イニシャライザーを呼び出しているんです。
イニシャライザーを指定しておかないと、上記のように自由に値を入れることはできず、いちいちプロパティを変えたいときにはインスタンス名.name = ""や.hairColor = ""を記載していかなければいけません。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
※イニシャライズの宣言
ちなみにイニシャライズの宣言方法は以下です。
init(ラベル1 引数名1: 型, ラベル2 引数名2: 型) {
文
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
3.selfとは
さて、ここまで解説してきましたが、
なんかselfとかいうのいましたね。何だこいつ。
プロパティに値を指定するときに、selfを使っていますが。
これはインスタンス自身を表す識別子です。
今回の場合、ProfileSetting構造体を宣言する{}の中でを指定すると、そのselfはProfileSetting構造体から作成されたインスタンスのことを指します。
別に構造体の中でname = nameって書いてあるんだからいちいちselfつけなくてもわかるっしょ。って思いますが、Xcodeは構造体ProfileSettingのプロパティのnameなのか、イニシャライザの第一引数のnameなのか区別できないんです。
人間じゃないから、なんとなくこれでしょは通じないんです。。。。
struct ProfileSetting {
var name: String
var hairColor: String
init(name: String, hairColor: String) {
self.name = name
self.hairColor = hairColor
}
func sayProfile() {
print("あなたのユーザ名は\(name)、髪の色は\(hairColor)です")
}
}
※ただし、selfをつけなくてもSwiftが区別できる場合はつけなくてOKです。
4.まとめ
イニシャライザーとは、 「構造体の初期設定を実行するメソッド」 です。
自分で構造体を作成する際、ここは自分じゃプロパティを指定できないと思った際は使用することになると思います。
基礎力が必要といった意味は、構造体ってなんだっけ?アプリ作成した時見た目としてどんな役割だっけ、そのようなところが抜けていると(想像できないと) 文章だけではわけわからないと思います。
土台は大事ですね。。。日々精進。
ではまた。