通过“部分关闭”的优雅方式?

时间:2018-03-23 09:50:45

标签: ios swift function uiview closures

在我的ViewController中,我正在设置多个所谓的PanelControl。 这些PanelControl初始化时带有标题UISlider和信息,另一个名为UIView的{​​{1}}的属性要更改为该滑块(ViewToEdit有参考它)。 它始终是ControlPanelCGFloat类型的单个属性。

我希望在初始化UIColor时能够传递ViewToEdit的属性(非值)。

所以我想这样用它:

PanelControl

PanelControl(title: "doesnt matter", propertyToEdit: ViewToEdit.propertyToEdit) 会像这样实现它:

PanelControl

请注意,上面的代码只是我的幻想而且实际上并不起作用。它只是说明了我想要的用法。

通过这种方式,我可以创建class PanelControl: UIView { ... func sliderChanged(slider: UISlider) { propertyToEdit = slider.value } } 的许多实例,并传递关于它们控制的PanelControl属性的每个不同信息。

我试过了:

  • 使用闭包,但这不合适,因为它不是我要传递的完整声明。而是声明的部分。所以ViewToEdit在执行时viewToEdit.propertyToEdit = ...设置了该语句的右侧。

  • 直接传递它PanelControl,但这显然没有任何意义。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

如何使用关键路径:

class PanelControl: UIView {
    let changer: (Float) -> Void

    init<T: AnyObject>(title: String, object: T, property: ReferenceWritableKeyPath<T, Float>) {
        changer = { object[keyPath: property] = $0 }
    }

    func sliderChanged(slider: UISlider) {
        changer(slider.value)
    }
}

你可以像这样使用它:

PanelControl(title: "doesnt matter", object: myViewModel, property: \ViewToEdit.propertyToEdit)