【问题标题】:How to Convert NSError SignalProducer to NoError SignalProducer in ReactiveCocoa (Swift)如何在 ReactiveCocoa (Swift) 中将 NSError SignalProducer 转换为 NoError SignalProducer
【发布时间】:2015-09-02 19:30:06
【问题描述】:

我有一个带有MutableProperty<Bool> 的模型,我有一个UIButton (ctaTopButton),它应该在按下该属性时翻转该属性,例如,单击时 true 变为 false,反之亦然。

我是这样设置的:

let producer = ctaTopButton.rac_signalForControlEvents(UIControlEvents.TouchUpInside).toSignalProducer()
    |> map {value in !self.model.enabled.value}


// model.enabled <~ producer  

我的问题的症结来自rac_signalForControlEvents(...).toSignalProducer() 返回一个SignalProducer&lt;AnyObject?, NSError&gt;,地图将其转换为SignalProducer&lt;Bool, NSError&gt;

中缀运算符&lt;~ 但仅适用于SignalProducer&lt;Bool, NoError&gt;,因此我需要以某种方式转换我的生产者。

我的问题是,如何降级错误?我知道有一个promoteErrors 用于将NoError 转换为NSError。还有mapError 虽然我不知道如何取回NoError 的实例,因为它没有初始化程序。

【问题讨论】:

    标签: ios swift reactive-cocoa reactive-cocoa-3


    【解决方案1】:

    对于这种情况,您可以使用 catch() 运算符,例如:

    let producer = ctaTopButton.rac_signalForControlEvents(.TouchUpInside).toSignalProducer()
        |> map { value in !self.model.enabled.value }
        |> catch { _ in SignalProducer<Bool, NoError>.empty }
    

    【讨论】:

    • 顺便说一句:我需要|&gt; catch{ _ in SignalProducer&lt;Bool, NoError&gt;.empty } 它不喜欢无参数版本。
    • 谢谢,我已经解决了。
    • 在 ReactiveCocoa 3 (Swift 2) 中使用 flatMapError 而不是 catch,以避免与 Swift 2 的 catch 冲突。
    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多