我想用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)")
}