在协议扩展子句中使用不带参数的泛型类型
问题描述:
如果associatedtype E
是Result<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)
}
不幸的是,斯威夫特抱怨Reference to generic type 'Result' requires arguments in <…>
。如果我使用建议的Fix-It将其更改为Result<Any>
,则不能在Result<MyObject>
'Result<LoginInfo>' is not convertible to 'Result<Any>'
上使用filterResult
。正如你所看到的,我实际上并不关心Element
这个类型。
有没有办法在Swift 3中实现这一点?
答
阅读this thread之后,我想,这似乎是neccessary使用协议包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)
}