【问题标题】:What is the easiest way to test if an enum-based variable is *not* equal to a specific case with an associated value?测试基于枚举的变量是否*不*等于具有关联值的特定情况的最简单方法是什么?
【发布时间】:2018-04-30 20:41:29
【问题描述】:

我们有以下枚举和变量

enum DisplayState{
    case loading
    case loaded(ViewModel)
    case noResults
    case error
}

var displayState:DisplayState = .loading

我们想测试我们是否处于loaded以外的任何状态。

既然有关联值,这当然行不通……

if displayState != .loaded {
    // Do something
}

但我希望能找到除了这些之外的其他东西......

switch displayState{
    case .loaded: break
    default: // Do something
}

if case .loaded = displayState {} else {
    // Do something
}

那么测试这种情况的最简单方法是什么?

【问题讨论】:

  • 你总是提出很好的问题。这个很有趣!我通常制作辅助计算变量,例如isLoadingisLoadedhasNoResultsisErrored,所以我会使用其中之一。
  • 感谢您的赞誉! Swift 是一门很棒的语言,这就是为什么这让我感到惊讶的是,对于这些你不关心值是什么的简单测试,它必须如此复杂。我觉得我应该能够测试一个值而忽略它的类型。我可能不得不访问 Swift Evolution,看看是否有理由不这样做。我的意思是你可以在忽略相关值的同时对其进行模式匹配,那么为什么不重载相等来做同样的事情呢?
  • 是的,我希望有一种为具有关联值的枚举制作的“metaenum”,它可以让您在不特别考虑关联值的情况下谈论案例。

标签: swift enums associated-value


【解决方案1】:

试试看:

enum DisplayState {
    case loading
    case loaded(ViewModel)
    case noResults
    case error

    var isLoaded: Bool {
        switch self {
        case .loaded:
            return true
        default:
            return false
        }
    }
}

var displayState: DisplayState = .loading

if displayState.isLoaded {
    // code
}

【讨论】:

  • 有趣的方法。很遗憾你必须像这样装饰你的枚举。我想知道为什么 Swift 团队不只允许简单的 != 检查。我的意思是你可以对它进行模式匹配!但这是一个很好的解决方法。让我把它打开一段时间,看看是否有人想出了任何替代方案。如果没有,我会将其标记为已接受。
  • @MarqueIV 我同意,但是枚举中的计算变量可能是你最好的选择。
猜你喜欢
  • 2017-05-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多