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.
fonte
2014-09-30 03:38:53
'newValue' è il valore predefinito, giusto? Quindi puoi usare 'set {', penso –