Swift子类' init必须在调用super之前设置所有属性,但属性需要超级初始化才能完成

时间:2014-09-30 13:54:30

标签: swift

我正在尝试编写两个Swift类,一个是另一个的子类,需要使用其中一个超类'属性并使用它来配置它自己。

class BaseClass {
    let someValue: Double
    let size: CGSize

    init (size: CGSize) {
        self.size = size
        self.someValue = size.width / 2.0 //Doesn't really matter how this is calculated
    }
}

class Subclass: BaseClass {
    let someNewValue: Double

    override init(size: CGSize) {
        super.init(size: size)
        self.someNewValue = self.someValue * 2
    }
}

问题是子类要求它对super.init的调用是在为其所有属性设置初始值之后。但是,执行此操作的self.someNewValue = self.someValue * 2调用依赖于首先调用super的init来设置self.someValue。我想我可以通过在BaseClass上将let someValue: Double转换为var someValue: Double来解决这个问题,然后在子类的init和基类的init中设置它的值,但这看起来很糟糕。

1 个答案:

答案 0 :(得分:2)

我在这里看到两个解决方案:

someNewValue隐式解包可选

class Subclass: BaseClass {
    let someNewValue: Double!

    override init(size: CGSize) {
        super.init(size: size)
        self.someNewValue = self.someValue * 2
    }
}

或在计算最终值

之前给someNewValue一些默认值
class Subclass: BaseClass {
    let someNewValue: Double = 0.0

    override init(size: CGSize) {
        super.init(size: size)
        self.someNewValue = self.someValue * 2
    }
}

两种方法都不应该引起任何问题