首页 > 解决方案 > 克服类型别名 '...' 引用自身

问题描述

背景

我有一个枚举,简化后是这样的:

enum Container<T> {
  case a(T)
  case b(T)
  case c
}

我希望能够用几种不同类型的泛型实例化它并typealias用于它:

typealias IntContainer = Container<Int>
typealias FloatContainer = Container<Float>

问题

到目前为止,这一切都很好。但是,我还想创建一个递归实例:

typealias CyclicContainer = Container<CyclicContainer>

Swift 报告了一个编译错误:

类型别名“CyclicContainer”引用自身

…当我将Container声明更改为:

indirect enum Container<T>

这有点烦人,因为这编译 Swift 是有益的:

indirect enum CyclicContainer {
  case a(CyclicContainer)
  case b(CyclicContainer)
  case c
}

解决方法 1

有一个解决方法。我可以声明,例如:

indirect enum CyclicContainer {
   case container(Container<CyclicContainer>)
}

CyclicContainer…但是,对于实例的简明描述,这变得很尴尬:

let cyclicContainer: CyclicContainer = .container(.a(.container(.b(.container(.c)))))

而不仅仅是:

let cyclicContainer: CyclicContainer = .a(.b(.c))

解决方法 2

我也可以简单地为递归情况创建一个单独的枚举,如前所示:

indirect enum CyclicContainer {
    case a(CyclicContainer)
    case b(CyclicContainer)
    case c
}

但是,我需要: 创建函数以在 和 之间进行CyclicContainer转换Container;重新实现存在于 上的各种成员函数Container<T>;如果我添加新案例或更改案例名称,请保持这两种类型的同步。

这不是非常艰巨,这是我倾向于的方法。但是当 Swift可以完全愉快地处理一个indirect enum,但当它是由枚举上的泛型参数的实例化时,这似乎是一种耻辱。

问题

有没有更好的办法?

标签: swiftenumsrecursive-type

解决方案


推荐阅读