我有两个班,Shape和Square
Shape
Square
class Shape { var numberOfSides = 0 var name: String init(name:String) { self.name = name } func simpleDescription() -> String { return "A shape with \(numberOfSides) sides." } } class Square: Shape { var sideLength: Double init(sideLength:Double, name:String) { super.init(name:name) // Error here self.sideLength = sideLength numberOfSides = 4 } func area () -> Double { return sideLength * sideLength } }
通过上面的实现,我得到了错误:
property 'self.sideLength' not initialized at super.init call super.init(name:name)
为什么我必须self.sideLength在调用之前设置super.init?
self.sideLength
super.init
引自 The Swift Programming Language,它回答了你的问题:
“Swift”编译器执行四项有用的安全检查,以确保两阶段初始化完成且没有错误:“ 安全检查 1“指定的初始化程序必须确保其类引入的所有属性在委托给超类初始化程序之前都已初始化。” 摘自:Apple Inc.“Swift 编程语言”。iBooks。 https://itunes.apple.com/us/book/swift- programming- language/id881256329?mt=11
“Swift”编译器执行四项有用的安全检查,以确保两阶段初始化完成且没有错误:“
安全检查 1“指定的初始化程序必须确保其类引入的所有属性在委托给超类初始化程序之前都已初始化。”
摘自:Apple Inc.“Swift 编程语言”。iBooks。 https://itunes.apple.com/us/book/swift- programming- language/id881256329?mt=11