2017-02-28 25 views
0

我想扩展一个RXSwift协议,即OsbervableConvertibleType,但我只想创建一个扩展方法只在OsbervableConvertibleTypes,它有一个结果对象。现在,Result又是通用的。但我想在我的扩展函数中保留泛型类型,所以我函数的返回类型也是通用的。这样的事情:Swift 3扩展约束到一个类型

extension ObservableConvertibleType where E: Result<T> { 
    public func asResultDriver() -> RxCocoa.SharedSequence<RxCocoa.DriverSharingStrategy, Result<T>> { 
     return self.asObservable() 
      .filter { $0.isSuccess } 
      .map { $0.value! } 
      .asDriver { _ in Driver.empty() } 
    } 
} 

在Swift 3中可能吗?

谢谢!

回答

2

你想要做什么是可能的,但你需要引入一个中间协议,因为Swift 3不支持泛型类型的扩展。

protocol ResultType { 
    associatedtype Value 

    var isSuccess: { Bool } 
    var value: Value? 
} 

extension Result: ResultType { } 

这给你一个基本协议ResultType,你就可以到ObservableConvertibleType扩展

extension ObservableConvertibleType where E: ResultType { 
    public func asResultDriver() -> RxCocoa.SharedSequence<RxCocoa.DriverSharingStrategy, Result<E.Value>> { 
     return self.asObservable() 
      .filter { $0.isSuccess } 
      .map { $0.value! } 
      .asDriver { _ in Driver.empty() } 
    } 
} 

如果您想了解更多内使用,也有很多关于这个技术文章躺在谷歌周围。真正帮助我理解它的那个是this one

+0

这正是我一直在寻找的。谢谢! :) – szantogab