提问者:小点点

使用原始类型大小写参数的Swift Enum的解决方法?


我想使用WallType创建SKSpriteNodes(请参阅下面的代码),并且仅当WallType时。Corner为其方向传递一个Side值。枚举具有原始值,因为我需要将它们作为plist中的数字加载并能够随机创建它们。

enum Side: Int {
  case Left = 0, Right
}

enum WallType: Int {
  case Straight = 0
  case Corner(orientation: Side)
}

我收到错误:“原始类型的枚举不能有带有参数的情况”

有没有一种变通方法,只有当SKSpriteNode的WallType时,我才能将其方向值传递给SKSpriteNode。角?目前,我每次都使用方向值对其进行初始化,即使没有必要,因为它的WallType。直的

我想我可以让Side成为可选的,但是我也必须更改许多其他使用Side的代码。然后,我仍然必须传入nil

我想像这样初始化墙:

let wall = Wall(ofType type: WallType)

有关它的方向的信息应该在WallType中,但前提是它是。角落。有没有办法扩展WallType以满足我的需求?

这个线程中提出的建议似乎并不真正适用于我的情况:关联值和原始值可以在Swift枚举中共存吗?

或者,如果我决定从WallType枚举中取出原始值,我将如何从plist中加载它?

我希望这有意义!感谢您的任何建议!


共1个答案

匿名用户

您可以将Side枚举保留为Int的子类,但您希望将此枚举传递给Wall,因此请确保它将rawValue或index和side作为创建Wall的参数。

像这样的东西,

enum Side: Int {
    case Left = 0, Right
}

enum Wall {
    case Straight(Int)
    case Corner(Int,Side)
}

let straight = Wall.Straight(0)
let corner = Wall.Corner(1, .Left)

switch straight {
    case .Straight(let index):
        print("Value is \(index)")
    case .Corner(let index, let side):
        print("Index is: \(index), Side is: \(side)")
}