RxSwift 中的 Binder,它接受可选的 Any

Posted

技术标签:

【中文标题】RxSwift 中的 Binder,它接受可选的 Any【英文标题】:Binder in RxSwift which accepts optional Any 【发布时间】:2018-10-26 10:27:58 【问题描述】:

我想为 UIButton 创建一个响应式扩展,它将采用任何对象(值和引用类型)并根据值启用按钮。如果它是 nil 我想禁用按钮并在它有值时启用。

代码如下:

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

当我尝试绑定包含可选结构的 observable 时,我得到一个错误:Ambiguous reference to member 'bind(to: )。有没有办法将Any 传递给Binder 或以不同的方式实现它?也许我想让它太笼统。

【问题讨论】:

【参考方案1】:

是的,您正在尝试制作过于通用的东西。例如,如果您希望为丢失的字符串禁用按钮,您可能还希望为空字符串禁用它,但无法在活页夹中表达。

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

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

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

【讨论】:

以上是关于RxSwift 中的 Binder,它接受可选的 Any的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RestKit 指定关系?

发布 TypeScript 包时如何处理可选的对等依赖项?

RxSwift:将 RX 绑定添加到 UITextField 时出错:“Binder<String?>”类型的值没有成员“debounce”

你可以在 Typescript 函数中有可选的解构参数吗?

ruby 实现Array#pad和Array#pad!。每个方法都接受最小大小(非负整数)和可选的pad值作为参数。如果是

ruby 实现Array#pad和Array#pad!。每个方法都接受最小大小(非负整数)和可选的pad值作为参数。如果是