RxSwift展开可选的便捷功能?

时间:2016-04-19 05:41:17

标签: swift rx-swift

目前我已经创建了一个函数unwrapOptional来安全地解包流中的可选输入。

    func unwrapOptional<T>(x: Optional<T>) -> Observable<T> {
       return x.map(Observable.just) ?? Observable.empty()
    }

    let aOpt: String? = "aOpt"
    _ = Observable.of(aOpt).flatMap(unwrapOptional).subscribeNext { x in print(x)}

    let aNil: String? = nil
    _ = Observable.of(aNil).flatMap(unwrapOptional).subscribeNext { x in print(x)}

    let a: String = "a"
    _ = Observable.of(a).flatMap(unwrapOptional).subscribeNext { x in print(x)}

   // output 
    aOpt
    a

我要归档的是创建一个方便的功能,而不是使用flatMap(unwrapOptional),例如

Observable.of(a).unwrapOptional()

我试图做的事情,但它永远不会编译......

extension ObservableType {
    func unwrapOptional<O : ObservableConvertibleType>() -> RxSwift.Observable<O.E> {
        return self.flatMap(unwrapOptional)
    }
}

4 个答案:

答案 0 :(得分:7)

您希望unwrapOptional方法仅适用于具有可选类型的observable。

因此,您必须限制Element的{​​{1}}以符合Observable协议。

Optional

不幸的是,Swift没有定义这样的协议(extension Observable where Element: OptionalType { /// Returns an Observable where the nil values from the original Observable are /// skipped func unwrappedOptional() -> Observable<Element.Wrapped> { return self.filter { $0.asOptional != nil }.map { $0.asOptional! } } } )。所以你还需要自己定义

OptionalType

答案 1 :(得分:5)

https://github.com/RxSwiftCommunity/RxSwift-Ext点检unwrap:)

https://github.com/RxSwiftCommunity/RxOptional

目前,您应该根据个人需要使用RxOptional 但是,RxSwift-Ext将在未来2-3个月内呈指数级增长:)

答案 2 :(得分:1)

这是不需要 ggplot(df, aes(Year, GPP_mean)) + geom_col(fill = "forestgreen", colour = "black") + geom_errorbar(aes(ymin = GPP_min, ymax = GPP_max), width = 0.5) + geom_col(aes(y = Reco_mean), fill = "red", colour = "black", position = "dodge") + geom_errorbar(aes(ymin = Reco_max, ymax = Reco_min), width = 0.5) (来自https://stackoverflow.com/a/36788483/13000)的版本

OptionalType

答案 3 :(得分:1)

RxSwift现在支持compactMap()。因此,现在您可以执行以下操作:

func unwrap(_ a: Observable<Int?>) -> Observable<Int> {
  return a.compactMap { $0 }
}