镜头进入Swift属性

时间:2014-10-22 20:58:05

标签: swift lenses

有没有办法在Swift中为类中的属性自动生成getter / setter函数对?在Haskell的透镜线上。

我已经能够手动执行以下操作:

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

但是,这比我想要的更冗长,更乏味,更容易出错。是否有我缺少的内置功能?

2 个答案:

答案 0 :(得分:0)

对于答案本身,到目前为止(1.1),任何语言构造都不会替代您正在做的事情(将存储的属性的访问过程包装到可引用的对象中)。

对于答案的意见部分,看起来你的代码只适用于公共变量,因为它们违反了基本的封装规则,这是正确的吗?

答案 1 :(得分:0)

您应该尝试Sourcery。我遇到了同样的问题,并且碰到了这个工具,如果您进行快速搜索,您应该可以轻松地找到Sourcery的一些已经制作好的模板,这些模板可以让您为数据类型生成镜头。