2014-10-22 14 views
8

Czy jest jakiś sposób automatycznego wygenerowania pary funkcji getter/setter dla właściwości klasy w Swift? Coś wzdłuż linii obiektywu w Haskell.Obiektywy w obiektach Swift

Byłem w stanie zrobić to ręcznie, co następuje:

class PropertyLens<U, T> { 
    let getter: U -> T 
    let setter: (U, T) ->() 

    init(getter: (U -> T), setter: ((U, T) ->())) { 
     self.getter = getter 
     self.setter = setter 
    } 

    func get(u: U) -> T { 
     return getter(u) 
    } 

    func set(u: U, t: T) { 
     setter(u, t) 
    } 
} 
// ... 
let myPropertyLens = PropertyLens<MyClass, Int>(getter: { $0.myProperty }, setter: { $0.myProperty = $1 }) 

jednak, że staje się gadatliwy, żmudne i bardziej podatne na błędy niż chciałbym. Czy brakuje wbudowanej funkcji?

+1

Jaki jest twój cel? O ile je rozumiem, soczewki w Haskell zostały zaprojektowane, aby umożliwić zmianę stanu, który Swift obejmuje już. Pomiędzy programami 'willSet' i' didSet' i właściwościami obliczonymi istnieje duża elastyczność. –

+3

Moim celem jest przeniesienie tego obiektywu na inny obiekt w celu manipulowania właściwościami. W moim bieżącym projekcie jest to obiekt, który generuje komórki widoku tabeli i reaguje na prasy w standardowy sposób. Obiektywy w Haskell nie dotyczą tak zmiennego stanu, jak tylko dostarczają kompozycyjnego sposobu na zapytanie i manipulowanie strukturami danych, choć powstaje z nich iluzja zmienności. –

+0

Metoda ObjC będzie po prostu przekazywać ciąg klawiszy, ale nie masz typu bezpieczeństwa –

Odpowiedz

0

Dla samej odpowiedzi, jak dotąd (1.1) żadna konstrukcja językowa nie zastąpi tego, co robisz (zawijanie procesu dostępu przechowywanej właściwości do obiektu odniesienia).

Dla części opinii, wygląda na to, że twój kod działa tylko ze zmiennymi publicznymi, które są nieprzyjemne, ponieważ łamią podstawowe zasady enkapsulacji, czy to prawda?

Powiązane problemy