Swift 3扩展约束为一种类型

时间:2017-02-28 11:36:23

标签: generics swift3 extension-methods rx-swift

我想扩展一个RXSwift协议,即OsbervableConvertibleType,但我只想在OsbervableConvertibleTypes上创建一个扩展方法,其中包含一个Result对象。现在,结果再次通用。但我想在我的扩展函数中保留泛型类型,因此我的函数的返回类型也是通用的。像这样:

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中使用吗?

谢谢!

1 个答案:

答案 0 :(得分: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