2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

required initって何?

Posted at

この記事で得られる情報

この記事では以下のことについて説明しています。

  • 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」の解説でした〜

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?