[英]Swift super.init() - Property not initialized at super.init call
[英]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 = sideLength
和super.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.