如何绑定 Signal<Bool, NoError> 以启用 属性 of UIButton in Reactive Cocoa 4

How to bind Signal<Bool, NoError> to enabled property of UIButton in Reactive Cocoa 4

我有一个非常简单的 ReactiveCocoa 用例。在我的设置中,我有两个 UITextField 和一个 UIButton

按钮的 enabled 属性 仅应设置为 true,前提是两个文本字段至少包含一个字符。

我开始创建一个 Signal<Bool, NoError>,它根据上述条件发出 truefalse

现在,据我所知,我需要以某种方式绑定 信号(或其值)到我按钮的enabled 属性。但我不知道该怎么做,一个多小时的研究没有得出任何结果……

更新: 据我所知,这以前可以使用 RAC 宏来实现:RAC(self.button, enabled) = signal;,或者类似的东西。但这对我没有帮助,因为宏在 RAC 3 中已被弃用。我的问题基本上与 相同,仅适用于 RAC 4 而不是 3。

这可以使用自定义 <~ 运算符来实现。但是,它只适用于 MutableProperty 类型的属性,因此我们不能只执行以下操作:

let signal: <Bool, NoError> = ...
button.enabled <~ signal

相反,我们需要将按钮的 enabled 属性 包裹在 MutableProperty 中,如下所示:

extension UIButton {
    public var rac_enabled: MutableProperty<Bool> {
        return lazyMutableProperty(self, key: &AssociationKey.text, setter: { self.enabled = [=11=] }, getter: { self.enabled })
    }
}

请注意,此实现取决于此 gist which was created by Colin Eberhardt

现在我们可以做:

button.rac_enabled <~ signal