この記事で得られる情報
この記事では以下のことについて説明しています。
- required修飾子とは何か
- required initの使い方
- required initはどういう時に使うのか
- required initがUIViewControllerなどを継承した際に強制実装されるのはなぜか
required修飾子ってなに?
required修飾子とは、以下の特徴を持つ修飾子です。
- イニシャライザにのみ使用することができる
- required initを持ったクラスを継承したサブクラスでは、必ずrequired initを実装する必要がある
コードを見ないとピンとこないかもしれません。次で解説します。
required initの使い方
実際には以下のように使います。
class Animal {
var name: String
// requiredを持ったイニシャライザを実装
required init(name: String) {
self.name = name
}
}
// required initが実装されているAnimalクラスを継承
class Dog: Animal {
// 親クラスで定義されているrequired initを実装
required init(name: String) {
super.init(name: name)
}
}
どういう時に使うの?
requiredおよび、required initの使い道は
俺を継承するなら初期化時に絶対にこれやれ!
なことを実装したい時に利用します。
先ほどのコードで説明すると、親クラスAnimalを継承したクラスは初期化時に必ず名前を設定する必要がある、ということですね。
こうすることで以下のようなメリットを得られます。
- コードの一貫性が保たれる
- Animalクラスを継承したクラスは一貫して「名前」を持たせることになります。
- 予見可能性が向上する
- requiredを使用せずにDogを生成した場合、名前を持たないAnimalの子クラスが生成される可能性があります。もしクラスの実装で「名前を持たないと致命的なエラーが出る!」なんて実装をしていた場合、Animalクラスでrequiredを実装していなかったせいで、防げたエラーが防げなかった、ということになってしまいます。
required initを強制的に実装させられたんだけど…
UIViewControllerやUIViewを継承したクラスでイニシャライザを実装した時、required initも実装せえよって怒られます。
これは単純にUIViewControllerやUIViewがrequired initを実装しているからです。
この辺について、詳しくは以下の記事が参考になります。
まとめ
required initはイニシャライザ専用のprotocolみたいな感じだと思います。
required initを使用することで、子クラスに特定の初期化処理を強制させられるので、コードの安全性を高めたり可読性も上がったりします。
以上、マニアックな修飾子「required」の解説でした〜