with stored property constructores cannot properties swift ios8 override

properties - stored - required swift



La anulaciĆ³n de la propiedad de Swift no funciona (2)

El mensaje de error del compilador es bastante sencillo: la propiedad de contents Card es mutable , es decir, tiene un método de set además del método de get .

Su anulación solo agrega un método de get , también necesita agregar un método de set .

Creo que esto es lo que quieres:

set(newValue) { rankStrings[Int(self.rank)] = newValue; }

Cuando intento anular una propiedad, aparece un error "no se puede anular una propiedad mutable con una propiedad de solo lectura"

He proporcionado obtener y establecer en la súper clase.

class Card { var contents:String { get { return self.contents } set { self.contents = newValue } } init() { self.contents = "" } }

Aquí está mi Subclase donde intento anular la propiedad "contenidos".

class PlayingCard: Card { override var contents:String { //<-- this is where I get the build error get { var rankStrings:Array<String> = PlayingCard.rankStrings() return rankStrings[Int(self.rank)] + self.suit } } }

¿Qué es exactamente lo que estoy haciendo mal?


Si la propiedad que está anulando tiene tanto un getter como un setter, también debe proporcionar ambos en su subclase. Aquí está la parte relevante de la guía de idiomas Swift (énfasis mío):

Puede presentar una propiedad de solo lectura heredada como una propiedad de lectura y escritura al proporcionar tanto un captador como un definidor en la anulación de la propiedad de subclase. Sin embargo, no puede presentar una propiedad de lectura / escritura heredada como una propiedad de solo lectura.

Si no está haciendo nada especial con el valor, entonces normalmente querrá pasar el valor que se establece a la clase base:

set { super.contents = newValue }

También puedes simplemente descartar el valor con un setter vacío (aunque no puedo pensar en una buena razón para hacerlo de manera inmediata):

set { }

También quería señalar que tiene un bucle infinito en la propiedad de contents en su clase de Card . Cuando haces esto:

get { return self.contents }

En realidad, solo estás llamando al mismo receptor otra vez, creando un bucle infinito; Estás haciendo lo mismo con el setter. Swift no crea ivars para sus propiedades automáticamente como lo hizo Objective-C, por lo que debe crearlas usted mismo. Una forma más apropiada de crear esa propiedad sería hacer algo como esto:

class Card { private var _contents: String var contents: String { get { return _contents } set { _contents = newValue } } init() { _contents = "" } }

Sin embargo, ya que no está haciendo nada más que configurar y devolver _contents en su configurador y _contents , puede simplificarlo de esta manera:

class Card { var contents: String = "" init() { } }

Nota: el contents también puede ser un buen candidato para usar un opcional ( String? ) Y configurarlo en nil lugar de inicializarlo en una cadena vacía.