在Swift 3中可以创建一个从其超类继承默认参数的子类。 。E.g,:
class ParentClass {
let red: Double
init(red: Double = 1.0) {
self.red = red
}
}
class ChildClass: ParentClass {
let blue: Double
init(blue: Double = 2.0) {
self.blue = blue
super.init()
}
}
我希望能够创建ChildClass的实例,这样如果我指定红色的值(例如let foo = ChildClass(red: 10.0)
),那么我可以设置它的值,但如果我不这样做的话它的值将是默认值(例如,let bar = ChildClass()
将具有bar.red = 1.0
)。
这可能吗?以上内容并不奏效,但从概念上讲,它是我喜欢的。另外,我不想在ChildClass中再次设置red的默认值(这会超过超类的一半值)。
如果使用可以起作用的结构或协议更好地完成类似的事情。
谢谢!
答案 0 :(得分:0)
如果我理解正确,这有效:
class ParentClass {
let red: Double
init(red: Double = 1.0) {
self.red = red
}
}
class ChildClass: ParentClass {
let blue: Double
init(blue: Double = 2.0, red: Double? = nil) {
self.blue = blue
if let red = red {
super.init(red: red)
} else {
super.init()
}
}
}
答案 1 :(得分:0)
创建类的实例时,必须初始化所有属性。实际上ChildClass
就像是:
class ChildClass: ParentClass {
let blue: Double
init(blue: Double = 2.0) {
self.blue = blue
super.init(red: <#defaultValue#>) <-- default initializer
}
}
没有init(red:)
,因为在调用var blue: Double
时,init(red:)
不会被初始化。
因此,如果要在子类中使用init(red:)
,则必须保证所有属性都已初始化。你可以尝试这样:
class ParentClass {
var red: Double
init() {
self.red = 1.0
}
convenience init(red: Double) {
self.init()
self.red = red
}
}
class ChildClass: ParentClass {
var blue: Double
override init() {
self.blue = 2.0
super.init()
}
convenience init(blue: Double) {
self.init()
self.blue = blue
}
}