2014-10-19 15 views
6

Na przykład, chciałbym wywołać metodę na instancji klasy, która doda do właściwości właściwość willSet. Nie chcę określać wartości willSet w deklaracji właściwości, ponieważ potrzebowałbym dodać logikę warunkową w obserwatorze i byłaby niepotrzebnie uruchamiana dla każdej innej instancji, która nie wywołała tej metody.Czy obserwator własności można dodać po początkowej deklaracji?

coś takiego:

var someProperty: Int 

func someMethod() { 
    someProperty { // this is the syntax/ability I'm unsure about 
     willSet { ...add some behavior... } 
    } 

    ...more stuff... 
} 

Odpowiedz

3

Obserwator może być dodany do właściwości zadeklarowanej w nadrzędnej, ale nie w tej samej klasie lub w rozszerzeniu klasy. Nie możesz zadeklarować tej samej właściwości w dwóch miejscach w funkcji. Najlepszym rozwiązaniem, jakie mogę wymyślić, jest coś takiego, w którym masz opcjonalne zamknięcie, które oceniasz w testamencie, a ty przypisujesz coś do tej właściwości tylko wtedy, gdy chcesz zachować obserwację.

może coś takiego:

private var _willSetCallback: ((Int) -> (Bool))? 
var someProperty: Int { 
    willSet { 
     if let optionalBool = _willSetCallback?(newValue) { 
      // do something 
     } 
    } 
} 

func someMethod() { 
    self._willSetCallback = { newValue in 
    return newValue > 0 
    } 
} 

To nie jest szczególnie elegancki, ale może bardziej lub mniej obsłużyć zachowanie pragnienie?

+1

Ah, więc nie jest to funkcja natywna w sposobie, w jaki pytałem. To rozwiązanie nie omija dwóch problemów, których dotyczyłem: każda instancja będzie musiała uruchomić 'willSet' i wynikający z tego warunek. Miałem nadzieję, że w jakiś sposób instancje nie będą miały "woli", chyba że dodadzą tego obserwatora w jakimś późniejszym momencie. – solidcell

+0

Czy martwi Cię wydajność? Ponieważ w powyższym przykładzie będziesz wykonywał tylko kod, jeśli opcjonalne zamknięcie nie jest zerowe, i sprawdzenie, czy zamknięcie! = Zero ma znikome konsekwencje wydajnościowe. – cmyr

+2

Częściowo po to, by poznać język. Jednakże, na przykład, myślę o przypadku, w którym chciałbym dodać rozszerzenie, które zawiera pewną logikę, i że obserwator właściwości powinien zostać zgrupowany w tym samym rozszerzeniu. – solidcell

Powiązane problemy