首页 > 解决方案 > 从 Swift 中的枚举中返回一个随机案例

问题描述

我刚刚写了一个函数,它生成一个 0...2 范围内的随机整数。目标是根据随机整数从枚举中返回一个随机案例。

我更喜欢使用 case 语句,但我不喜欢返回任意枚举的默认 case。省略默认情况将不起作用,因为 switch 无法知道会发生多少情况。即使默认情况永远不会发生,我也不认为这是一个干净的解决方案。

您更喜欢哪个解决方案分别认为是最干净的解决方案 - 请详细说明。有没有更好/更优雅的方式从枚举中返回随机案例?

If-else 解决方案:

    func generateRandomSign() -> Sign {
        let randomSelection = Int.random(in: 0...2)

        if randomSelection == 0 {
            return .rock
        } else if randomSelection == 1 {
            return .paper
        }
        return .scissor
    }

开关解决方案:

    func generateRandomSign() -> Sign {
        let randomSelection = Int.random(in: 0...2)

        switch randomSelection {
        case 0: return .rock
        case 1: return .paper
        case 2: return .scissor
        default: return .rock
        }
    }

标签: iosswiftenums

解决方案


没有必要搞乱Ints。您应该声明您Sign enum符合CaseIterable并调用randomElement()它的allCases属性(顾名思义,它包含 的所有情况enum)。

这样您就不会牺牲类型安全性,并且保证Sign每次都能取回一个案例。

enum Sign: CaseIterable {
    case rock
    case paper
    case scissor

    static func random() -> Sign {
        return allCases.randomElement()! // safe to force unwrap, since the enum has at least 1 property, so this can never be `nil`
    }
}

你可以这样称呼它let randomSign = Sign.random()


推荐阅读