2017-10-04 34 views
3

数ブロック:スウィフト初期化子ミステリー

これは動作します:上記のコードで

import Foundation 

class Class1 { 
    init(param1: String?) { 
     print("hello") 
    } 

    convenience init() { 
     self.init(param1: nil) 
    } 
} 

class SubClass1: Class1 { 

} 

let obj = SubClass1() 

をSubClass1は独自の指定された初期化子が提供されていないため、指定された初期化子はSubClass1に受け継がれています。また、便利なイニシャライザも渡されます。したがって、これは動作します。

これはSubClass1が独自の指定されたイニシャライザを提供したためです。

import Foundation 

class Class1 { 
    init(param1: String?) { 
     print("hello") 
    } 

    init(param2: String?) { 
     print("world") 
    } 

    convenience init() { 
     self.init(param1: nil) 
    } 
} 

class SubClass1: Class1 { 
    override init(param1: String?) { 
     print("hello 2") 
     super.init(param1: nil) 
    } 
} 

let obj = SubClass1() 

これは、最後の行について、パラメータ 'param1'がパラメータ "param1 'に" error:missing argument "を与えます。 ここでは、SubClass1のために指定された初期化子があり、親からの便利な初期化子も同じ初期化子を呼び出します。

この

import Foundation 

class Class1 { 
    init(param1: String?) { 
     print("hello") 
    } 

    required init(param2: String?) { 
     print("world") 
    } 

    convenience init() { 
     self.init(param1: nil) 
    } 
} 

class SubClass1: Class1 { 
    override init(param1: String?) { 
     print("hello 2") 
     super.init(param1: nil) 
    } 

    required init(param2: String?) { 
     print("world") 
     super.init(param2: nil) 
    } 
} 

let obj = SubClass1() 

とこの作品:

import Foundation 

class Class1 { 
    init(param1: String?) { 
     print("hello") 
    } 

    init(param2: String?) { 
     print("world") 
    } 

    convenience init() { 
     self.init(param1: nil) 
    } 
} 

class SubClass1: Class1 { 
    override init(param1: String?) { 
     print("hello 2") 
     super.init(param1: nil) 
    } 

    override init(param2: String?) { 
     print("world") 
     super.init(param2: nil) 
    } 
} 

let obj = SubClass1() 

なぜそれがすべて指定された初期化子が一つだけ指定された初期化子のを呼び出す作業に初期化子1つの便宜上オーバーライドする必要がありますか?

答えて

1

この動作は、swift guideに明示されています。

Assuming that you provide default values for any new properties you introduce in a subclass, the following two rules apply:

Rule 1 If your subclass doesn’t define any designated initializers, it automatically inherits all of its superclass designated initializers.

Rule 2 If your subclass provides an implementation of all of its superclass designated initializers—either by inheriting them as per rule 1, or by providing a custom implementation as part of its definition—then it automatically inherits all of the superclass convenience initializers.

だから基本的に、あなたのサブクラスは/上書き継承されたコンビニエンス初期化子スーパークラスを取得するために指定された初期化子をスーパークラスのすべてを定義する必要があります。