RxSwift中的活页夹,可以接受可选的Any

时间:2018-10-26 10:27:58

标签: swift observable rx-swift rx-cocoa

我想为UIButton创建一个Reactive扩展,它将接受任何对象(值和引用类型),并将基于该值启用按钮。如果为零,我想禁用该按钮,如果有值,则启用它。

代码如下:

extension Reactive where Base: UIButton {
    var isEnabledForModel: Binder<Any?> {
        return Binder(base, binding: { 
            $0.isEnabled = $1 != nil
        })
    }
}

当我尝试绑定包含可选结构的可观察对象时,出现错误:Ambiguous reference to member 'bind(to: )。有什么方法可以将Any传递给活页夹或以其他方式实现?也许我想让它过于通用。

1 个答案:

答案 0 :(得分:0)

是的,您正在尝试制作过于通用的内容。例如,如果您要为缺少的字符串禁用按钮,则可能还希望为空字符串禁用该按钮,但是无法在活页夹中表示该按钮。

也就是说,您的代码对我来说很好。我建议您清理构建文件夹并重新构建。尽管它可以编译,但使用点却比我想的要复杂。

let foo = Observable<Int?>.just(nil)
foo
    .map { $0 as Any? }
    .bind(to: button.rx.isEnabledForModel)
    .disposed(by: bag)

请注意,您必须手动Int?映射到Any?中。如果删除地图,则会收到错误消息“无法推断出通用参数'Self'”。因为它是一个通用参数,所以系统不会通过继承树寻找可能的匹配项,因此不会接受isEnabledForModel