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

时间:2016-11-11 14:02:20

标签: ios swift switch-statement

我有一堆包含不同案例的枚举。想象它就像石头剪刀一样。

enum Play {
    case Rock, Paper, Scissors
}

现在我正在创建一个具有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
        }
    }
}

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

更新:

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

4 个答案:

答案 0 :(得分: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
    }
}

当然这仍适用于R-P-S。只需删除最后两个元素。请记住,枚举顺序非常重要。

答案 1 :(得分:3)

您可以简单Dataswitch个实例的元组进行比较,使用Play运算符来确定它们是否相等,以及一系列枚举案例模式匹配确定游戏是否比另一个更有效。

例如:

==

答案 2 :(得分:2)

似乎Play类型应该提供&#34;比较自己的方法&#34;给别人最终使事情变得更加容易和清晰:

DLookup

输出:

  摇滚节拍剪刀

     纸张与纸张是平局

答案 3 :(得分:1)

我提出了这个更清洁的解决方案但我起初并不接受它。我想知道是否还有其他更好的方法,我没想到。

为可能的优势创建数组可能是更好的解决方案,然后在我的初始值设定项中进行详尽的切换,如下所示:

var strongAgainst: [Play]
var weakAgainst: [Play]

init(withPlayType play: Play) {
    switch play {
        case .Rock {
            strongAgainst.append(Play.Scissors)
            weakAgainst.append(Play.Paper)
            break
        }
        // ...etc
    }
}

通过检查攻击类型是否在strongAgainstweakAgainst数组中,这可以使我的攻击方法更简单。