比较所有可能情况下的两个枚举

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)

这是一种丑陋的暴力方法,但我很难想出更好的解决方案.

更新:

按照惯例......在我提出问题之后,我想出了一个更好的解决方案.我将把这个解决方案作为答案但我不会接受它,直到我得到别人的答案,因为可能有更好的方法.

Rob*_*ier 5

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.只需删除最后两个元素.请记住,枚举顺序非常重要.