如果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)
}
不幸的是,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中实现这个目标?
答案 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)
}