Swift 3 扩展限制为一个类型

Posted

技术标签:

【中文标题】Swift 3 扩展限制为一个类型【英文标题】:Swift 3 extension constrained to a type 【发布时间】:2017-02-28 11:36:22 【问题描述】:

我想扩展一个 RXSwift 协议,即 OsbervableConvertibleType,但我只想在 OsbervableConvertibleTypes 上创建一个扩展方法,其中包含一个 Result 对象。现在, 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】:

你想做的事情是可能的,但你需要引入一个中间协议,因为 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() 
    

如果您想了解更多信息,Google 上有很多关于这种技术的文章。真正帮助我理解它的是this one。

【讨论】:

这正是我想要的。谢谢! :)

以上是关于Swift 3 扩展限制为一个类型的主要内容,如果未能解决你的问题,请参考以下文章

使用键和值约束扩展字典

Swift学习:扩展(Extensions)

Swift3 - 扩展类型集合的问题

Swift中扩展的使用

Swift的可选链,类型转换和扩展

Swift学习Swift编程之旅---扩展(二十四)