Cal*_*YSR 3 switch-statement ios swift
我有一个包含大量不同案例的枚举.想象它就像石头剪刀一样.
enum Play {
case Rock, Paper, Scissors
}
Run Code Online (Sandbox Code Playgroud)
现在我正在创建一个具有Play属性和方法的类,该方法将另一个Play参数作为"攻击者",我需要比较所有可能的结果.我能想到的唯一方法就是嵌套开关,但由于我的枚举超过3个案例,因此它成为一个很有可能出错的大功能.
func determineEffectiveness(withAttacker attacker: Play) {
switch attacker.type {
case .Rock {
switch self.type {
case .Rock {
return 0
}
case .Paper {
return 1
}
case .Scissors {
return -1
}
}
}
case .Paper {
// ...etc
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一种丑陋的暴力方法,但我很难想出更好的解决方案.
更新:
按照惯例......在我提出问题之后,我想出了一个更好的解决方案.我将把这个解决方案作为答案但我不会接受它,直到我得到别人的答案,因为可能有更好的方法.
Rock,Paper,Scissors是一款平价游戏.如果你让游戏变得更复杂,比如Rock,Paper,Scissors,Spock,Lizard,它会变得更加清晰.如果距离是偶数,则较低的值获胜.如果距离是奇数,则较高的值获胜.这是我们构建它的一种简单方法:
enum Hand: Int {
enum Result {
case lose, tie, win
}
case rock, paper, scissors, spock, lizzard
func result(against: Hand) -> Result {
let distance = rawValue - against.rawValue
if distance == 0 { return .tie }
if distance % 2 == 0 {
return (rawValue < against.rawValue) ? .win : .lose
}
return (rawValue > against.rawValue) ? .win : .lose
}
}
Run Code Online (Sandbox Code Playgroud)
当然这仍适用于RPS.只需删除最后两个元素.请记住,枚举顺序非常重要.