swift - 如何仅检查 Swift 嵌套枚举是否与外部枚举相等?

标签 swift

我正在尝试使用嵌套枚举来描述我的模型,以一种使非法状态成为不可能并在顶层提供分类的方式。现在,我的(简化的)代码是:

enum SportsEvent {

    enum RunningEvent {
        case sprint
        case marathon
    }

    enum ThrowingEvent {
        case hammer
        case javelin
        case discus
    }

    case running(event: RunningEvent)
    case throwing(event: ThrowingEvent)

    func isSameCategory(as other: SportsEvent) -> Bool {

        return false
    }
}

let sprint = SportsEvent.running(event: .sprint)
let javelin = SportsEvent.throwing(event: .javelin)
let hammer = SportsEvent.throwing(event: .hammer)

sprint.isSameCategory(as: javelin)      // False
hammer.isSameCategory(as: javelin)      // True

使用 if case ... 和通配符感觉应该是微不足道的,但我不知道如何实现它。我希望不需要巨大的 switch 语句,因为我的实际模型更复杂。

最佳答案

我想你需要一个 switch 语句,用一个“复合案例”列出所有 外部枚举的可能“相同值组合”, 加上默认情况:

func isSameCategory(as other: SportsEvent) -> Bool {
    switch (self, other) {
    case (.running, .running),
         (.throwing, .throwing):
        return true
    default:
        return false
    }
}

或者(归因于@Hamish):

func isSameCategory(as other: SportsEvent) -> Bool {
    switch (self, other) {
    case (.running, .running),
         (.throwing, .throwing):
        return true
    case (.running, _),
         (.throwing, _):
        return false
    }
}

它的优点是编译器会检查是否涵盖了所有情况。对于包含 n 的枚举,使得 2 * n switch 语句中的情况(如果您检查了所有可能的组合,这比 n * n 更好)。

关于swift - 如何仅检查 Swift 嵌套枚举是否与外部枚举相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50586223/

相关文章:

SwiftUI 文本动画不透明度不起作用

python - Swift NSSocket 编程/python 教程修复

Swift 闭包语法

ios - 通过 UIActivityView 共享时 NSURL 打印两次

swift - 从 Parse 检索到所有响应后执行操作

swift - Codable 用于使用单一模型映射不同的键值

使用类在枚举上快速切换大小写

ios - 如何使用 Alamofire 在 iOS13 的 GET 请求中发送 httpBody?

Swift Mac Quick Look 显示图像

ios - Segue 只工作一次?