簡體   English   中英

Swift:super.init和self.attribute在初始化中的順序

[英]Swift: Order of super.init and self.attribute in init

我正在嘗試初始化一個如下的子類:

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的錯誤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)."
    }

}

現在還好,有人可以解釋其背后的原理嗎? 謝謝!!!

之所以修正,是因為蘋果公司對這種語言的“安全”方法。 在方法調用之前未初始化的任何未包裝和未初始化的變量將引發編譯器錯誤。 這是Swift中的一項安全功能。 基本上,編譯器試圖避免執行以下操作:

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

someFunctionThatUsesSideLengthBeforeItsInitialized可能會導致異常。 我認為, super.init類的超類函數應不受此規則super.init

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM