2015-04-07 14 views
14

Quando si ignora la funzione noise, la funzione viene sostituita da quella nuova. Ma quando sovrascrivo una proprietà con un osservatore, il vecchio e il nuovo valore vengono entrambi eseguiti.Ignora osservatore proprietà

nel parco giochi:

class Vehicle { 
    func noise(sound: String) { 
     println("Vehicle sound sounds like \(sound)") 
    } 
} 

class Train: Vehicle { 
    override func noise(sound: String) { 
     println("A train does: \(sound)") 
    } 
} 

uscita:

var oldTrain = Train() 
bulletTrain.noise("tjoek tjoek") // Prints: "A train does: tjoek tjoek" 

Ma quando faccio lo stesso con una proprietà con un osservatore:

nel parco giochi:

class Foo { 
    var something: Int! { 
     didSet { 
      println("vroom") 
     } 
    } 
} 

class Bar: Foo { 
    override var something: Int! { 
     didSet { 
      println("toot toot") 
     } 
    } 
} 

Uscita:

var foobar = Bar() 
foobar.something = 3 // Prints: "vroom" & "toot toot" 

Quindi, come posso eseguire l'override di una proprietà con un osservatore e come impedire che i vecchi valori vengano eseguiti anche?

+0

Non sembra possibile impedire l'esecuzione del vecchio osservatore delle proprietà. – mrahmiao

+0

è incredibile non è possibile sovrascrivere 'didSet' – Fattie

risposta

24

È possibile ignorare la parte set e get della proprietà e spostare il numero lì. In questo modo Swift non chiamerà il codice originale - a meno che non chiami super.

class Foo { 
    private var _something: Int! 

    var something: Int! { 
     get { 
      return _something 
     } 
     set { 
      _something = newValue 
      println("vroom") 
     } 
    } 
} 

class Bar: Foo { 
    override var something: Int! { 
     get { 
      return _something 
     } 
     set { 
      _something = newValue 
      println("toot toot") 
     } 
    } 
} 

Questo non è carino, però.

Ecco una migliore - e più semplice - soluzione:

class Foo { 
    var something: Int! { 
     didSet { 
      somethingWasSet() 
     } 
    } 

    func somethingWasSet() { 
     println("vroom") 
    } 
} 

class Bar: Foo { 
    override func somethingWasSet() { 
     println("toot toot") 
    } 
} 

Poiché non v'è alcun modo per "override" il didSet, ciò che rimane è l'override una funzione secondaria creato appositamente per questo scopo.

+0

Come suggerito da @nhgrif, ho combinato le due soluzioni in un'unica risposta. –

+0

Grazie, questo ha aiutato un sacco. Strano che non puoi semplicemente ignorare 'didSet'. Come ho letto, Apple ha corretto alcuni bug relativi a 'didSet' non molto tempo fa. Ho avuto la sensazione che abbiano ancora molti bug da risolvere riguardo a "didSet". – Eendje

+0

Non credo che permettere agli osservatori di proprietà di essere sovrascritti sia probabile che sia nei lavori in qualsiasi momento ... – nhgrif