Swift 3扩展约束到一个类型
问题描述:
我想扩展一个RXSwift协议,即OsbervableConvertibleType,但我只想创建一个扩展方法只在OsbervableConvertibleTypes,它有一个结果对象。现在,Result又是通用的。但我想在我的扩展函数中保留泛型类型,所以我函数的返回类型也是通用的。这样的事情:Swift 3扩展约束到一个类型
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中可能吗?
谢谢!
答
你想要做什么是可能的,但你需要引入一个中间协议,因为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。
这正是我一直在寻找的。谢谢! :) – szantogab