在协议扩展子句中使用不带参数的泛型类型

时间:2017-07-14 10:51:32

标签: swift3 rx-swift

如果associatedtype EResult<T>,我想用函数扩展协议。我想要达到的目标如下:

extension SharedSequenceConvertibleType where E == Result {

    func filterResult(success: Bool) -> RxCocoa.SharedSequence<Self.SharingStrategy, Self.E> {
        return self.filter { result in
            switch (result) {
            case .Success(_):
                return success
            case .Failure(_):
                return !success
            }
        }
    }
}

enum Result<Element> {
    case Success(Element)
    case Failure(Swift.Error)
}

不幸的是,Swift抱怨Reference to generic type 'Result' requires arguments in <…>。如果我应用建议的修补程序将其更改为Result<Any>,则无法在filterResult Result<MyObject>上使用'Result<LoginInfo>' is not convertible to 'Result<Any>'。正如您所见,我实际上并不关心Element类型。

有没有办法在Swift 3中实现这个目标?

1 个答案:

答案 0 :(得分:0)

在阅读this thread之后,我认为似乎有必要使用协议来包装Result<Element>。以下工作:

extension SharedSequenceConvertibleType where E: ResultType {

    func filterResult(success: Bool) -> RxCocoa.SharedSequence<Self.SharingStrategy, Self.E> {
        return filter { result in return success == result.isSuccess }
    }
}


protocol ResultType {
    var isSuccess: Bool { get }
}

enum Result<Element>: ResultType {
    var isSuccess: Bool {
        switch self {
        case .Success:
            return true
        default:
            return false
        }
    }

    case Success(Element)
    case Failure(Swift.Error)
}