使用原始类型+案例参数的Swift Enum的解决方法?

时间:2015-06-11 20:55:43

标签: ios swift enums

我想使用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中加载它?

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

1 个答案:

答案 0 :(得分:0)

你可以这样做,这样你就可以将Side enum留给Int的子类,但是你想把这个枚举传递给Wall,所以确保它将rawValue或index和side作为创建Wall的参数。 / p>

像这样,

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)")
}