在我的ViewController中,我正在设置多个所谓的PanelControl
这些PanelControl使用标题,UISlider和信息以及另一个UIView称为ViewToEdit的属性随该滑块更改(ControlPanel对其进行了引用)进行了初始化。
它始终是CGFloatUIColor类型的单个属性。

我希望能够在初始化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设置。
从字面上传递它ViewToEdit.propertyToEdit,但这显然也没有任何意义。


我该怎么办?

最佳答案

如何使用关键路径:

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)

关于ios - 通过“部分关闭”的优雅方式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49446744/

10-09 08:20