2014-09-30 12 views
13

Quando si tenta di sostituire una proprietà ottengo un errore "non può ignorare proprietà mutevole con la proprietà di sola lettura"Swift override di proprietà non lavora

Ho fornito get e set nella classe eccellente.

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

Questa è la sottoclasse in cui sto cercando di ignorare la proprietà "content".

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 
     } 
    } 
} 

Che cosa sto sbagliando?

risposta

2

Il messaggio di errore del compilatore è abbastanza semplice: contents proprietà Card s' è mutabile, vale a dire che ha un metodo set in aggiunta al metodo get.

L'override aggiunge solo un metodo get, è inoltre necessario aggiungere un metodo set.

penso che questo è ciò che si vuole:

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

'newValue' è il valore predefinito, giusto? Quindi puoi usare 'set {', penso –

18

Se la proprietà si sta sovrascrivendo ha sia un getter e setter, è necessario fornire sia nella sottoclasse pure. Ecco il relevant part from the Swift language guide (sottolineatura mia):

è possibile presentare una sola lettura proprietà ereditata come una lettura-scrittura proprietà, fornendo sia un getter e setter nella sottoclasse proprietà di modifica. Tuttavia, non è possibile presentare una proprietà di lettura/scrittura ereditata come proprietà di sola lettura.

Se non stai facendo nulla di speciale con il valore Allora ti genere si desidera passare il valore viene impostato su alla classe di base:

set { 
    super.contents = newValue 
} 

Si potrebbe anche solo scartare il valore con una setter vuoto (anche se non posso pensare a una buona ragione per fare questo estemporaneo):

set { } 

ho voluto anche po int che hai un ciclo infinito nella proprietà contents nella tua classe Card. Quando si esegue questa operazione:

get { 
    return self.contents 
} 

Stai realtà solo chiamando che ancora una volta lo stesso getter, creando un ciclo infinito; stai facendo lo stesso con il setter. Swift non crea ivar per le tue proprietà automaticamente come ha fatto l'Objective-C, quindi devi crearle tu stesso.Un modo più appropriato per creare che la proprietà sarebbe quello di fare qualcosa di simile:

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

Tuttavia, dal momento che non sta facendo altro che l'impostazione e tornare _contents nel setter e getter, è possibile semplificare il basso per questo:

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

    } 
} 

Nota:contents potrebbe anche essere un buon candidato per l'utilizzo di un optional (String?) e impostarla a nil piuttosto che l'inizializzazione è una stringa vuota.

Problemi correlati