2016-11-23 4 views
0

Swiftクラスについては、必要な初期化子と委任初期化子の間に少し混乱があります。Swift - 必要初期化子と委譲初期化子との間の少しの混乱

私のコード例では、NewDogを2つの方法のうちの1つで初期化することができます。ご覧のように、初期化時に年齢だけを入力することで初期化することができます。この場合、デフォルト名が割り当てられます( "Buddy")。

私がまだ理解していないのは、初期化子が使用されていない場合でも、NewDogクラスが必要なキーワードを必要とする理由です。 var georgieは正規のイニシャライザを使用しています(NewDogでは必須ではありません)。

実際には必須ではありませんが、必要な点は何ですか? *初期化子を取り除くと、コンパイラは私に "必要な初期化子init"が 'Dog'のサブクラスによって提供されなければならないと怒鳴ります。

まあ大丈夫です...私はそれを入れました。でも、それを使用する必要はありません.NewDogの最初の初期化子がメンバープロパティの初期化をすべて実行しているためです...私はロジックはここにあります。

class Dog { 
    var name : String 
    required init(_ name: String) { 
     self.name = name 
    } 
} 

class NewDog: Dog { 
    var age : Int? 
    init(age: Int, name: String) { 
     super.init(name) 
     self.age = age 
    } 

    required init(_ name: String) { 
     super.init(name) 
    } 
} 

var georgie = NewDog(age: 6, name: "Georgie") 
georgie.age 

誰かが必要なキーワードの説明をしてくれますか?私の推測では、単にコンパイラに "ちょっと...落ち着いて...名前プロパティは私のサブクラスで初期化されます。なぜなら、あなたは私にそれを要求することを叫んでいるからです。私は自分自身を作成し​​ている明示的なサブクラスのイニシャライザでそれを行うつもりです... "

*****また、ボーナスの質問:NewDogの初期化子のどれがDesignated Initializerですか?

おかげ

答えて

1

required初期化子は、すべてのサブクラスでも同じ初期化子を実装しなければならないことを意味します。 Dogクラスでinit(_:)初期化子が必要になったため、Dogのすべてのサブクラス(およびそのサブクラス)も同じrequired init(_:)イニシャライザを提供する必要があります。

イニシャライザをDogクラスにする必要はありません。そのキーワードを削除すると、NewDogクラスからinit(_:)イニシャライザを削除できます。

ボーナス - NewDogクラスのメソッドはいずれも便利な初期化子ではないので、どちらも初期化子と呼ばれます。

デフォルト、便利、必要なイニシャライザの違いと使い方を学ぶ必要があります。これはすべてIntializersThe Swift Programming Languageのセクションに明示されています。

+0

私は指定と必要の違いについてのみ混乱していました。しかし、ありがとう。また、Dogクラスで必要とされる初期化は、多相性目的のためであった。 Dog型を取り、新しいインスタンスを初期化して返すファクトリを作成しました。 Dog型を取ったので、私がDog型のサブクラスを通過している可能性があることをコンパイラに知らせるために必要でした。 – user7024499

+0

したがって、trueまたはfalse ...あなたの言葉では、「すべてのサブクラスも同じ初期化子を実装する必要があります」ということを意味しますが、サブクラスがその初期化子を使用する必要はありません。上記の例で明らかなように、インスタンスは別の指定された初期化子で作成されました。 – user7024499

+0

真、 '必須'はそれが存在しなければならないことを意味します。それが使用されなければならないという意味ではありません。 – rmaddy

関連する問題