我建立了一些网关/提供程序,以便在我的API中集成API,使用RX Swift,我试图在一个看起来像干净简单的方式处理分页。
基本上,函数签名看起来像这样:
func getPlaces(with location: CLLocationCoordinate2D) -> Observable<(value: [Place], next: Observable<(value: [Places], Observable<(value: [Place], next: ... ... >>
这很快就显得不切实际,所以我尝试为此创建一个类型:
typealias Result = Observable<(value: [Place], next: Result?)>
所以我的函数签名看起来像这样:
func getPlaces(with location: CLLocationCoordinate2D) -> Result
但是Xcode不会那么容易被愚弄,并且会引导我引用我自己的类型
所以......它甚至可行吗?怎么样?
答案 0 :(得分:5)
我不认为使用typealias
可以实现这一点,因为您正在创建无限类型。我能想到的唯一方法是使Observable
成为递归枚举:
enum Observable {
case end([Place])
indirect case node([Place], Observable)
}
答案 1 :(得分:0)
所以,我使用一个案例将我的方法与Nibr混合在一起。这允许从ViewModel方面更简单地(在我看来)处理分页
enum Result<T> {
indirect case node([T], Observable<Result>?)
var value: [T] {
if case let GatewayResult.node(value, _) = self {
return value
}
return []
}
var next: Observable<Result>? {
if case let GatewayResult.node(_, next) = self {
return next
}
return nil
}
}