Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如果基于枚举的变量*不*等于具有关联值的特定情况,最简单的测试方法是什么?_Swift_Enums_Associated Value - Fatal编程技术网

Swift 如果基于枚举的变量*不*等于具有关联值的特定情况,最简单的测试方法是什么?

Swift 如果基于枚举的变量*不*等于具有关联值的特定情况,最简单的测试方法是什么?,swift,enums,associated-value,Swift,Enums,Associated Value,我们有以下枚举和变量 enum DisplayState{ case loading case loaded(ViewModel) case noResults case error } var displayState:DisplayState = .loading 我们想测试我们是否处于除加载的之外的任何状态 因为有一个关联的值,这当然不起作用 if displayState != .loaded { // Do something } 但我希望

我们有以下枚举和变量

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

var displayState:DisplayState = .loading
我们想测试我们是否处于除加载的
之外的任何状态

因为有一个关联的值,这当然不起作用

if displayState != .loaded {
    // Do something
}
但我希望除了这两个之外还能找到别的东西

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

那么,最简单的测试方法是什么呢?

试试:

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
}

你一直是一个好问题的来源。这个很有趣!我通常会制作助手计算变量,比如
isLoading
isLoaded
hasNoResults
iErrored
,所以我会使用其中的一个。谢谢大家!Swift是一种非常棒的语言,这就是为什么我惊讶于它对于这些简单的测试如此复杂,而你不关心它的值是什么。我觉得我应该能够测试一个值,而忽略它的类型。我可能必须访问Swift Evolution,看看不这样做背后是否有理由。我的意思是,你可以在忽略关联值的情况下对其进行模式匹配,那么为什么不重载相等来做同样的事情呢?是的,我希望有一种针对关联值的枚举的“metaenum”,它可以让你在不特别考虑关联值的情况下讨论案例。有趣的方法。你不得不这样装饰你的物品,真是太遗憾了。我想知道为什么Swift团队不允许简单的检查。我的意思是你可以和它比赛!但这是一个很好的解决办法。让我把它开久一点,看看有没有人能想出别的办法。如果没有,我会将其标记为已接受。@MarqueIV我同意,但是枚举中的计算变量可能是您的最佳选择。
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
}