Swift子类的init必须在调用super之前设置所有属性,但属性需要super的init才能首先完成

火腿

我正在尝试编写两个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,执行此操作调用依赖于首先调用set的super的init self.someValue我想我可以通过打开BaseClasslet someValue: Double解决这个问题var someValue: Double,然后在子类的init和基类的init中设置其值,但这似乎很糟糕。

柯斯坦斯

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

使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
    }
}

两种方式都不会造成任何问题

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档