2017-10-04 94 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不提供自己的指定初始化器。另外,方便初始化者也傳遞下來。因此,這工作。

import Foundation 

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

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

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

let obj = 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'在調用中缺少參數」。 在這裏,SubClass1有一個指定的初始化程序,而Parent的便捷初始化程序也會調用相同的初始化程序,那麼爲什麼會出現錯誤?

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() 

爲什麼它需要所有的指定initialisers被覆蓋在一個方便初始化器工作調用只是指定initialisers之一?

回答

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.

所以基本上,你的子類必須覆蓋/定義所有超的指定initialisers獲得超類的繼承方便initialisers。