2015-12-23 13 views
9

Mam właściwośćSwift może leniwy i didSet ustawić razem

public lazy var points: [(CGFloat,CGFloat,CGFloat)] = { 
     var pointsT = [(CGFloat,CGFloat,CGFloat)]() 
     let height = 100.0 
     for _ in 1...10 { 
      pointsT.append((someValue,someValue,100.0)) 
     } 
     return pointsT 
    }() 

i chcę dodać metodę didSet, jest to możliwe?

+0

co to jest 'ar' w' dla p w ar'? – dfri

+1

Zmieniono to, nie ma to nic wspólnego z pytaniem. dzięki. –

Odpowiedz

13

Krótka odpowiedź: nie.

Wypróbuj ten prosty przykład w jakiejś klasy lub metody Ciebie:

lazy var myLazyVar: Int = { 
    return 1 
}() { 
    willSet { 
     print("About to set lazy var!") 
    } 
} 

To daje następujący błąd kompilacji czasu:

Lazy properties may not have observers.


W odniesieniu do rachunku let w druga odpowiedź: zmienna leniwy nie jest konieczna po prostu "niech stałe o opóźnionej inicjalizacji". Rozważmy następujący przykład:

struct MyStruct { 
    var myInt = 1 

    mutating func increaseMyInt() { 
     myInt += 1 
    } 

    lazy var myLazyVar: Int = { 
     return self.myInt 
    }() 
} 

var a = MyStruct() 
print(a.myLazyVar) // 1 
a.increaseMyInt() 
print(a.myLazyVar) // 1: "initialiser" only called once, OK 
a.myLazyVar += 1 
print(a.myLazyVar) // 2: however we can still mutate the value 
        // directly if we so wishes 
+1

Masz absolutną rację, usuniesz to z mojej odpowiedzi, która w zasadzie brzmi "nie" :) Do dzieła! – luk2302

2

nr

points jest stała, nie można ustawić coś do niego. Jedyną różnicą dla stałej let jest to, że jest (potencjalnie) zainicjowana później.

This answer dostarcza trochę więcej informacji, dlaczego używasz var zamiast let w przypadku lazy.

Edycja: aby odpowiedź nie spojrzeć, aby opróżnić Spójrz na this blog post którym autor porusza kilka ważnych punktów dotyczących dlaczego obserwując lazy vars może nie jeszcze być obsługiwane. Co powinien mieć oldValue w obserwatorze? nil? To nie byłby dobry pomysł w waszym nieobowiązkowym przypadku.

+0

* "Jedyna różnica w stosunku do stałej let jest taka, że ​​jest (potencjalnie) zainicjowana później" *, to nie jest prawda. Leniwe partie mogą być używane jako 'var': s równie dobrze, zobacz mój dodany przykład. – dfri

+0

Odnośnie edycji: Zgadzam się, dobry dodatek. Poza tym byłeś nieco na punkcie tego leniwego var * powinien * ogólnie zachowywać się niezmiennie po inicjalizacji, ponieważ ogólnie używamy leniwych vars na (duże?) Instancje klasy lub struktury, które same się nie zmienią (nawet jeśli ich członkowie mutują; ale możemy mieć do tego oddzielnych obserwatorów). W związku z tym mamy nasz własny zestaw 'once-only-will'' w naszym inicjatorze zmiennych leniwych (np. Print" Will be set! "). Więc być może Apple zamierza (konwencja-mądry) dla leniwych varów, aby się nie zmieniły po init., Stąd kolejny powód, dla którego nie ma rekwizytów. obserwatorzy. – dfri

4

Odpowiedź jest krótka jak inne powiedzieć brzmi „nie”, ale istnieje sposób, aby uzyskać efekt przy użyciu wewnętrznego ukrytego leniwe var var komputerową.

private lazy var _username: String? { 
    return loadUsername() 
} 
var username: String? { 
    set { 
     // Do willSet stuff in here 
     if newValue != _username { 
      saveUsername(newValue) 
     } 
     // Don't forget to set the internal variable 
     _username = newValue 
     // Do didSet stuff here 
     // ... 
    } 
    get { 
     return _username 
    } 
}