swift - 克服类型别名 '...' 引用自身
问题描述
背景
我有一个枚举,简化后是这样的:
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
,但当它是由枚举上的泛型参数的实例化时,这似乎是一种耻辱。
问题
有没有更好的办法?
解决方案
推荐阅读
- android - 使用 setOnClickListener Kotlin 在 android 中执行应用程序时出错
- c# - C#比较两个强类型列表
- python - 如何使嵌套列表表现得像 numpy 数组?
- python - Python电报机器人 - AttributeError:'sqlite3.Cursor'对象没有属性'data_filter'
- java - Java NIO解码过程中如何去掉不正确的符号?
- android - Nativescript Angular-“typeof View”类型上不存在属性“SYSTEM_UI_FLAG_IMMERSIVE_STICKY”
- sockets - 具有相同本地地址的套接字能否同时处于两种状态“LISTEN”和“ESTABLISHED”
- c# - 使用 C# 访问 JSON 正文
- sql - Oracle SQL - 插入到选择语句中 - 错误
- typescript - 为什么打字稿在移相器中找不到这些方法?