2016-04-19 11 views
2

現在ストリーム内のオプションの入力を安全にアンラップするために、関数unwrapOptionalを作成しました。RxSwiftオプションの便利な機能をアンラップしますか?

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

あなたはその観測上の唯一の仕事へunwrapOptional方法をしたいですオプションのタイプがあります。

ElementObservableをどうにかしてOptionalプロトコルに準拠させる必要があります。

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! } 
    } 
} 

残念ながら、Swiftはこのようなプロトコル(OptionalType)を定義していません。あなた自身もそれを定義する必要があります

/// Represent an optional value 
/// 
/// This is needed to restrict our Observable extension to Observable that generate 
/// .Next events with Optional payload 
protocol OptionalType { 
    associatedtype Wrapped 
    var asOptional: Wrapped? { get } 
} 

/// Implementation of the OptionalType protocol by the Optional type 
extension Optional: OptionalType { 
    var asOptional: Wrapped? { return self } 
} 
関連する問題