2014-10-22 5 views
8

Есть ли способ автоматически генерировать пару функций getter/setter для свойства в классе в Swift? Что-то вдоль линий объектива в Хаскелле.Объективы в свойствах Swift

Я был в состоянии сделать следующее вручную:

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 }) 

Однако это становится многословным, утомительным и более подвержены ошибкам, чем хотелось бы. Есть ли встроенная функция, которую мне не хватает?

+1

Какую цель? Насколько я понимаю, линзы в Haskell предназначены для использования изменяемого состояния, которое уже включает Swift. Между обработчиками 'willSet' и' didSet' и вычисленными свойствами существует большая гибкость. –

+3

Моя цель - передать этот объектив другому объекту для управления свойствами. В моем текущем проекте это объект, который генерирует ячейки таблицы и отвечает на нажатия стандартным способом. Объективы в Haskell не связаны с изменчивым состоянием, поскольку они предназначены для предоставления сложного способа запроса и управления структурами данных, хотя из них возникает иллюзия изменчивости. –

+0

Путь ObjC будет просто проходить цепочку ключей, но у вас нет безопасности типов. –

ответ

0

Для самого ответа (1.1) никакая языковая конструкция не заменит то, что вы делаете (перенос процесса доступа хранимого свойства в объект, подлежащий обработке).

Для части ответа, похоже, ваш код работает только с общедоступными переменными, которые являются неприятными для того, чтобы они нарушили основные правила инкапсуляции, верно ли это?