在Swift 3中,子类是否可以从其超类继承默认值?

时间:2017-09-30 01:41:57

标签: ios swift swift3

在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的默认值(这会超过超类的一半值)。

如果使用可以起作用的结构或协议更好地完成类似的事情。

谢谢!

2 个答案:

答案 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
    }
}