如何创建一个引用自己的类型别名?

时间:2018-03-23 23:04:04

标签: swift rx-swift

我建立了一些网关/提供程序,以便在我的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不会那么容易被愚弄,并且会引导我引用我自己的类型

所以......它甚至可行吗?怎么样?

2 个答案:

答案 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
    }
}