2015-10-12 10 views
6

Rozumiem, że jeden jest seter, a drugi jest obserwatorem własności. Moje pytanie brzmi: w jaki sposób różnią się one zachowaniem i kiedy używałbyś jednego z drugim. Czy oni nie robią prawie tak samo? Na przykład:Jakie są podstawowe różnice między zestawem i didSet?

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

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

Odpowiedz

9

Nie robią prawie to samo, wręcz przeciwnie mają zupełnie inne cele. Modele get i set są używane w obliczeniach właściwości. Na przykład weź przykładową strukturę, która nie ma żadnego rzeczywistego zastosowania, ale jest dobrym demo.

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 

Więc, jak widać, zmienna number nie jest zmienna w tradycyjnym sensie, że jest to nieruchomość komputerowej. Tak więc, gdy zadzwonię pod numer s.number, otrzymam iloczyn x i y. Ponadto użyłbyś zestawu do zmiany innych zmiennych (nie samej własności obliczeniowej) w strukturze. Tak więc ustawiłem x i y na różne wartości w oparciu o newValue. Ten pomysł wyliczonej właściwości może być używany zamiast funkcji i uważam, że jest bardzo przydatny w upraszczaniu pobierania danych z funkcji. Na przykład, możesz mieć strukturę, która ma dystans w kilometrach i możesz chcieć tego w milach bardzo często. Możesz więc utworzyć obliczoną właściwość miles dla mil, która oblicza liczbę kilometrów metodą get i zmienia liczbę kilometrów z ustawiaczem, jeśli ustawiłeś mile w swoim programie.


Teraz, po didSet i willSet. Możesz ich użyć do powiadomienia struktury o zmianie wartości. Na przykład średniTracker.

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 

Wskazówki jak didSet jest faktycznie na zmiennej, która zawiera wartość, to znaczy, że nie jest to własność komputerowej. Ponadto użyłem obliczonej właściwości average, aby uzyskać średnią. Ogólnie rzecz biorąc, mam nadzieję, że wyjaśniłem twoje zamieszanie dotyczące tego bardzo mocnego aspektu Swift.

Powiązane problemy