2015-06-11 26 views
3

我想创建一个带有WallType(请参阅下面的代码)的SKSpriteNodes,并且只有当WallType.Corner时,才会为其方向传递一个Side值。 枚举具有原始值,因为我需要将它们加载为plist中的数字,并且能够随机创建它们。Swift Enum与原始类型+ case参数的变通方法?

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

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

我得到的错误:“枚举与原始类型不能有例参数”

有一种解决方法,我可以通过SKSpriteNode一个值,其方向只有当它的WallType.Corner ? 目前,我每次都用方向值初始化它,即使它没有必要,因为它的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?

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

+0

因为你只有两个方面,你有没有考虑具有用于左角和右角另一个枚举值枚举值? – zneak

+0

谢谢zneak,这当然是一种解决方法!我宁愿将WallType枚举与2个案例保持一致,因为我在其他地方也使用它,但如果没有合理的其他解决方案,我会这样做。 – nontomatic

回答

0

你可以这样做,让你把Side enum留给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)") 
} 
+0

非常感谢您的帮助!如果我误解了,请原谅我,但是我是否仍然需要通过我的类实例墙才能在wallType的顶端输入参数?因为这是我想避免的。在你的例子中是否是“直接切换”的错字? – nontomatic

+0

那么即使上面的代码可以工作,你也必须这么做吗?无论如何,如果你想让墙拥有Side,那么为什么在构建Wall的时候避免通过Side的实例呢?笔直不是错字。我只想告诉你,你如何测试你的墙的实例.Corner或.Straight类型。 – Sandeep

+0

好的,我明白了。我只注意到我自己的代码示例中有一个错字。这个枚举的名字是“WallType”,正如我的文本中提到的那样,而不是“Wall”。抱歉!我试图初始化需要上述“WallType”作为参数的类“Wall”的实例“wall”。我希望我不需要用WallType以外的任何东西来初始化那个墙,这样Side的信息就已经包含在那个WallType中了。感谢您解释您的代码,我会在早上尝试一下,然后回到这里。 – nontomatic