1

我正在尝试初始化一个子类,如下所示:

class NameShape{
    var numberOfSide: Int = 0
    var name:String
    func simpleDescription() -> String {
        return "A square with \(numberOfSide) sides."
    }
    init (name: String){
        self.name = name
        }
}

class Square:NameShape{
    var sideLength: Double
    init(name: String, sideLength: Double){
        super.init(name: name)
        self.sideLength = sideLength
        numberOfSide = 4
    }

    func area() ->Double {
        return sideLength * sideLength
    }

    override func simpleDescription() -> String {
        return "A square with sides of length \(sideLength)."
    }

}

我得到一个错误property 'self.sideLength' not initialized at super.init call,所以我切换self.sideLength = sideLengthsuper.init(name: name),例如:

class Square:NameShape{
    var sideLength: Double
    init(name: String, sideLength: Double){            
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSide = 4
    }

    func area() ->Double {
        return sideLength * sideLength
    }

    override func simpleDescription() -> String {
        return "A square with sides of length \(sideLength)."
    }

}

现在很好,有人可以解释背后的原理吗?谢谢!!!

4

1 回答 1

1

您更改固定的原因是因为 Apple 对这种语言的“安全”方法。在方法调用之前未初始化的任何未包装和未初始化的变量都会引发编译器错误。这是 Swift 中的一项安全功能。基本上,编译器试图让你免于做这样的事情:

init(name: String, sideLength: Double){            
    super.init(name: name)
    someFunctionThatUsesSideLengthBeforeItsInitialized(sideLength)
    self.sideLength = sideLength
    numberOfSide = 4
}

此方法someFunctionThatUsesSideLengthBeforeItsInitialized可能会导致异常。在我看来,像这样的超类函数super.init应该不受这条规则的约束。

于 2014-08-16T02:20:56.423 回答