可以移动的模型游戏角色
让我们定义一个简单游戏中使用的方向枚举:
enum Direction { case up case down case left case right}
现在在游戏中我需要两种角色:
>一个只能左右移动的HorizontalMover. ←→
>只能上下移动的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)}
其中HorizontalDirection和VerticalDirection是Direction枚举的子集枚举.
像这样独立定义两个方向类型没有多大意义,没有任何共同的“祖先”:
enum HorizontalDirection { case left case right}enum VerticalDirection { case up case down}
因为那时我不得不一遍又一遍地重新定义相同的情况,对于代表方向的每个枚举,它们在语义上是相同的.例如.如果我添加另一个可以向任何方向移动的角色,我也必须实现一般方向枚举(如上所示).然后我在HorizontalDirection枚举中有一个左边的情况,并且在一般的方向枚举中有一个左边的情况,它们彼此不了解,这不仅是丑陋的,而且在分配和利用原始值时会成为一个真正的问题.必须在每个枚举中重新分配.
那么有没有办法解决这个问题呢?
我可以将枚举定义为另一个枚举的子集吗?
enum HorizontalDirection: Direction { allowedCases: .left .right}解决方法 不.目前,Swift枚举无法实现这一目标.
我能想到的解决方案:
>使用我在您的其他问题中概述的协议>回退到运行时检查
总结以上是内存溢出为你收集整理的swift – 我可以将枚举定义为另一个枚举的子集吗?全部内容,希望文章能够帮你解决swift – 我可以将枚举定义为另一个枚举的子集吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)