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的主要内容,如果未能解决你的问题,请参考以下文章
RxSwift:将 RX 绑定添加到 UITextField 时出错:“Binder<String?>”类型的值没有成员“debounce”
ruby 实现Array#pad和Array#pad!。每个方法都接受最小大小(非负整数)和可选的pad值作为参数。如果是
ruby 实现Array#pad和Array#pad!。每个方法都接受最小大小(非负整数)和可选的pad值作为参数。如果是