En el lenguaje Swift, para inicializar una instancia, uno debe completar todos los campos de esa clase, y solo luego llamar a superconstructor:
class Base {
var name: String
init(name: String) {
self.name = name
}
}
class Derived: Base {
var number: Int
init(name: String, number: Int) {
// won't compile if interchange lines
self.number = number
super.init(name)
}
}
Para mí, parece al revés, porque la instancia debe self
crearse antes de asignar valores a sus campos, y ese código da la impresión de que el encadenamiento ocurre solo después de la asignación. Aparte de eso, la superclase no tiene medios legales para leer los atributos introducidos de su subclase, por lo que la seguridad no cuenta en este caso.
Además, muchos otros lenguajes, como JavaScript, e incluso el Objetivo C, que es un ancestro espiritual de Swift, requieren un encadenamiento antes de acceder self
, no después.
¿Cuál es el razonamiento detrás de esta elección para requerir que los campos se definan antes de llamar al superconstructor?
self
.