«super.init ()» следует вызывать после инициализации всех ваших переменных экземпляра.
В видеоролике Apple «Intermediate Swift» (вы можете найти ее на странице видеоресурсов разработчика Apple https://developer.apple.com/videos/wwdc/2014/), примерно в 28:40, явно сказано, что все инициализаторы в суперклассе должны быть вызваны ПОСЛЕ того, как вы инициализируете переменные экземпляра.
В Objective-C это было наоборот. В Swift, поскольку все свойства должны быть инициализированы до его использования, нам нужно сначала инициализировать свойства. Это означает предотвращение вызова функции переопределения из метода «init ()» супер класса без первоначальной инициализации свойств.
Таким образом, реализация «Квадрат» должна быть:
class Square: Shape {
var sideLength: Double
init(sideLength:Double, name:String) {
self.sideLength = sideLength
numberOfSides = 4
super.init(name:name) // Correct position for "super.init()"
}
func area () -> Double {
return sideLength * sideLength
}
}