required(feat.Initializer自動継承)

3363 ワード

UIViewControllerの初期化器を継承するCustom ViewConに再定義すると、overrideではなくrequiredを使用する必要がある騒ぎが発生します.
これは必要ですか?では、どうして子供のクラスでこれを実現しなくても帰るのですか.
まずinitializerに興味のある人のために正式な書類を投げます

required initializer


実際、特に何もありません.継承関係では、すべてのサブclassが
「サブクラス、このようなパラメータリストを受け入れる初期化器は必ず実現しなければならない」と言える.
例を見てみましょう
class ABC {
    var a: Int
    required init() {
        self.a = 1
    }
}

class DEF: ABC {
    var b: Int
    required init() {
        self.b = b
        super.init()
    }
}
上記の例のrequiredの目的ABCクラスはrequiredキーワードによりパラメータを受け入れない初期化器を実現し,サブクラスが実現しなければならないことを要求する.
また,サブクラスDEFも実現し,コンパイルエラーは発生しなかった.
上記の例では、requiredの使用方法について説明します.
パラメータリストが同じであるため,本来はoverrideキーワードを用いるべきであったが,requiredキーワードに代わって
詳細については、本書を参照してください.

自動継承Initializer

requiredと言ったときになぜ急に自動継承と言うのですか?UIViewControllerの初期化器は、requiredとして宣言される.
ただし、サブクラスcustom viewconで再定義しなくてもコンパイルエラーは発生しません.
どうしてこんなことになったの?
結論から言えば、
「自動継承」親のinitializerの条件下で、サブクラスはrequired initializerを実現する必要はありません.
(親を使用)
自動継承条件について説明します.

自動継承の親のイニシエータの条件


基本的にinitializerは親から継承されない特徴があります
それでも、初期化器は、特定の条件を満たす限り自動的に継承されます.
(この特定の条件は意外に頻繁に発生します)
📌 ルール1:サブクラスのイニシエータがない場合
この場合、親の初期化器は自動的に継承されます.
そのためrequiredを別途実現する必要はありません
📌 ルール2:条件を満たす場合に自動的に継承できる便利さ
(これはrequiredとは関係ありませんが、特別です^^;)
サブクラスで親のデザインをすべて実現すると、親の利便性を自動的に継承する機能があります

n/a.結論


要するに、UIViewControllerrequiredと定義したinitializerは、私たちのcustom viewconでinitializerを再定義する必要はありません.なぜなら、initializerが作成されていないため、自動継承が発生するからです.