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

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

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

我收到错误消息:“原始类型的枚举不能包含带有参数的个案”

是否有一种解决方法,仅当其WallType.Corner时,才可以向SKSpriteNode传递其方向的值?
目前,我每次都使用一个指向方向的值对其进行初始化,即使由于它的WallType.Straight也不是必须的时。

我想我可以将Side设为可选,但随后我还必须在使用Side的地方更改很多其他代码。
然后,我仍然必须传递nil

我想像这样初始化墙:
let wall = Wall(ofType type: WallType)

关于它的方向的信息应该在WallType内,但前提是它是.Corner
有没有办法扩展WallType以适合我的需求?

此线程中的建议似乎不适用于我的情况:
Can associated values and raw values coexist in Swift enumeration?

另外,如果我决定从WallType枚举中删除原始值,我将如何从plist加载它呢?

我希望这是有道理的!感谢您的任何建议!

最佳答案

您可以这样做,以便将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)")
}

07-26 04:05