swift – 我可以将枚举定义为另一个枚举的子集吗?

swift – 我可以将枚举定义为另一个枚举的子集吗?,第1张

概述注意:这与我昨天在Stackoverflow上发布的 another one基本相同.但是,我认为我在那个问题中使用了一个不好的例子,这个例子并没有完全归结为我的想法.由于对原始帖子的所有回复都提到了第一个问题,我认为将新示例放在一个单独的问题中可能更好一点 – 没有重复的意图. 可以移动的模型游戏角色 让我们定义一个简单游戏中使用的方向枚举: enum Direction { case 注意:这与我昨天在Stackoverflow上发布的 another one基本相同.但是,我认为我在那个问题中使用了一个不好的例子,这个例子并没有完全归结为我的想法.由于对原始帖子的所有回复都提到了第一个问题,我认为将新示例放在一个单独的问题中可能更好一点 – 没有重复的意图.

可以移动的模型游戏角色

让我们定义一个简单游戏中使用的方向枚举:

enum Direction {    case up    case down    case left    case right}

现在在游戏中我需要两种角色:

>一个只能左右移动的Horizo​​ntalMover. ←→
>只能上下移动的VerticalMover. ↑↓

他们都可以移动所以他们都实现了

protocol Movable {    func move(direction: Direction)}

那么让我们定义两个结构:

struct HorizontalMover: Movable {    func move(direction: Direction)    let allowedDirections: [Direction] = [.left,.right]}struct VerticalMover: Movable {    func move(direction: Direction)    let allowedDirections: [Direction] = [.up,.down]}

问题

…使用这种方法是我仍然可以将不允许的值传递给move()函数,例如以下调用有效:

let horizontalMover = HorizontalMover()horizontalMover.move(up) // ⚡️

当然,我可以检查move()函数内部是否允许此Mover类型传递方向,否则抛出错误.但是由于我确实有编译时允许的情况,我还希望在编译时进行检查.

所以我真正想要的是:

struct HorizontalMover: Movable {    func move(direction: HorizontalDirection)}struct VerticalMover: Movable {    func move(direction: VerticalDirection)}

其中Horizo​​ntalDirection和VerticalDirection是Direction枚举的子集枚举.

像这样独立定义两个方向类型没有多大意义,没有任何共同的“祖先”:

enum HorizontalDirection {    case left    case right}enum VerticalDirection {    case up    case down}

因为那时我不得不一遍又一遍地重新定义相同的情况,对于代表方向的每个枚举,它们在语义上是相同的.例如.如果我添加另一个可以向任何方向移动的角色,我也必须实现一般方向枚举(如上所示).然后我在Horizo​​ntalDirection枚举中有一个左边的情况,并且在一般的方向枚举中有一个左边的情况,它们彼此不了解,这不仅是丑陋的,而且在分配和利用原始值时会成为一个真正的问题.必须在每个枚举中重新分配.

那么有没有办法解决这个问题呢?

我可以将枚举定义为另一个枚举的子集吗?

enum HorizontalDirection: Direction {    allowedCases:        .left        .right}
解决方法 不.目前,Swift枚举无法实现这一目标.

我能想到的解决方案:

>使用我在您的其他问题中概述的协议>回退到运行时检查

总结

以上是内存溢出为你收集整理的swift – 我可以将枚举定义为另一个枚举的子集吗?全部内容,希望文章能够帮你解决swift – 我可以将枚举定义为另一个枚举的子集吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1018750.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存