2015-10-12 9 views
6

Capisco che uno è un setter e l'altro è un osservatore di proprietà. La mia domanda è come si differenziano nel comportamento e quando useresti l'uno sull'altro. Non fanno più o meno la stessa cosa? Ad esempio:Quali sono le differenze fondamentali tra set e didSet?

var foo: String { 
set { 
    run code when set 
} 
} 

var foo: String { 
didSet { 
    run code when set 
} 
} 

risposta

9

Non fanno più o meno la stessa cosa, al contrario hanno scopi completamente diversi. Il get e il set vengono utilizzati su proprietà calcolate. Ad esempio, prendi questa struttura di esempio che non ha reale utilità, ma è una buona dimostrazione.

struct test { 
    var x = 5 
    var y = 5 
    var number: Int { 
     get { 
      return x * y 
     } 
     set (newValue){ 
      x = newValue/2 
      y = newValue/2 
     } 
    } 
} 

var s = test() 
s.number //25 
s.number = 100 
s.x //50 
s.number //2500 

Quindi, come si può vedere, la variabile number non è una variabile in senso tradizionale, si tratta di una proprietà calcolata. Quindi, quando chiamo s.number ottengo il prodotto di xey. Inoltre, dovresti usare il set per cambiare altre variabili (non la proprietà calcolata stessa) nella struttura. Quindi, ho impostato x e su valori diversi in base allo newValue. Questa idea di una proprietà calcolata può essere utilizzata al posto di una funzione e trovo molto utile semplificare il recupero dei dati da una funzione. Ad esempio, potresti avere una struttura che ha una distanza in chilometri e potresti volerlo in miglia molto frequentemente. Quindi, è possibile creare una proprietà calcolata miles per miglia che calcola il numero di chilometri con il metodo get e cambia il numero di chilometri con il setter se si imposta miglia nel programma.


Ora, per la didSet e willSet. È possibile utilizzare questi per notificare la struttura di una modifica di valore. Ad esempio, un Traditore medio.

struct averageTracker { 
    var total: Double = 0 { 
     didSet { 
      numEntries++ 
     } 
    } 
    var numEntries: Double = 0 
    var average: Double { 
     get { 
      return total/numEntries 
     } 
    } 
} 


var ave = averageTracker() 
ave.total += 10 
ave.total += 20 
ave.average //15 

Si noti come il didSet è in realtà una variabile che contiene un valore, cioè, non è una proprietà calcolata. Inoltre, ho usato una proprietà calcolata average per ottenere la media. Nel complesso, spero di aver chiarito la tua confusione riguardo a questo aspetto molto potente di Swift.

Problemi correlati