Noté que el compilador no me deja anular una propiedad almacenada con otro valor almacenado (lo que parece extraño):
class Jedi {
var lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor = "Red" // Cannot override with a stored property lightSaberColor
}
Sin embargo, se me permite hacer esto con una propiedad calculada:
class Jedi {
let lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor : String{return "Red"}
}
¿Por qué no se me permite darle otro valor?
¿Por qué reemplazar una propiedad almacenada es una abominación y hacerlo con un kosher calculado? ¿Qué donde piensan?
inheritance
swift
properties
overriding
cfischer
fuente
fuente
Respuestas:
Definitivamente se le permite dar a una propiedad heredada un valor diferente. Puede hacerlo si inicializa la propiedad en un constructor que toma ese valor inicial y pasa un valor diferente de la clase derivada:
Anular una propiedad no es lo mismo que darle un nuevo valor, es más como darle a una clase una propiedad diferente. De hecho, eso es lo que sucede cuando anula una propiedad calculada: el código que calcula la propiedad en la clase base se reemplaza por el código que calcula la anulación de esa propiedad en la clase derivada.
Además de los observadores, las propiedades almacenadas no tienen comportamiento, por lo que realmente no hay nada que anular. Dar a la propiedad un valor diferente es posible a través del mecanismo descrito anteriormente. Esto hace exactamente lo que el ejemplo en la pregunta está tratando de lograr, con una sintaxis diferente.
fuente
Para mí, su ejemplo no funciona en Swift 3.0.1.
Entré en el patio de recreo este código:
Lanza error en tiempo de compilación en Xcode:
No, no puede cambiar el tipo de propiedad almacenada. El principio de sustitución de Liskov obliga a permitir que se use una subclase en un lugar donde se desee la superclase.
Pero si lo cambia
var
y, por lo tanto, agrega elset
en la propiedad calculada, puede anular la propiedad almacenada con una propiedad calculada del mismo tipo.Esto es posible porque puede tener sentido cambiar de propiedad almacenada a propiedad calculada.
Pero anule una
var
propiedad almacenada con una propiedad almacenadavar
propiedad no tiene sentido, porque solo puede cambiar el valor de la propiedad.Sin embargo, no puede anular una propiedad almacenada con una propiedad almacenada en absoluto.
No diría que los Sith son Jedi :-P. Por lo tanto, está claro que esto no puede funcionar.
fuente
fuente
Probablemente desee asignar otro valor a la propiedad:
fuente
Para Swift 4, de la documentación de Apple :
fuente
En Swift, desafortunadamente esto no es posible. La mejor alternativa es la siguiente:
fuente
Tuve el mismo problema para establecer una constante para un controlador de vista.
Como estoy usando el generador de interfaces para administrar la vista, no puedo usar
init()
, por lo que mi solución fue similar a otras respuestas, excepto que usé una variable calculada de solo lectura en las clases base y heredadas.fuente
Si intentas hacer eso en Swift 5 serás recibido por un
Su mejor apuesta es declararlo como una propiedad calculada.
Esto funciona ya que estamos anulando la
get {}
funciónfuente
Swift no le permite anular una variable
stored property
En lugar de esto, puede usarcomputed property
Es más claro cuando se compara con Java, donde un campo de clase no se puede anular y no admite polimorfismo porque se define en tiempo de compilación (se ejecuta de manera eficiente). Se llama ocultación de variables [Acerca de] No se recomienda utilizar esta técnica porque es difícil de leer / soportar
[Propiedad Swift]
fuente
También puede usar una función para anular. No es una respuesta directa, pero puede enriquecer este tema)
Clase A
Clase B: A
fuente