2016-08-02 162 views
1

如果我有比较嵌套枚举

var currentState: TransformState = .Default 
enum TransformState { 
    case Default 
    case Error(ErrorState) 

    enum ErrorState { 
     case Custom 
     case Default 
    } 
} 

var state = TransformState.Error(.Custom) 

我如何检查是否state == currentState

+0

覆盖您的枚举的'=='。可能重复[如何测试Swift枚举与关联值的相等性](http://stackoverflow.com/questions/24339807/how-to-test-equality-of-swift-enums-with-associated-values) – JAL

+0

@日航我看到了这个问题,我仍然困惑,因为在我的情况下,它是嵌套枚举。 – natecraft1

回答

2

你只需要实现EquatableTransformState

TransformState.ErrorState得到它是免费的,所以您可以使用这一事实在您实现:

extension TransformState: Equatable {} 
func ==(lhs: TransformState, rhs: TransformState) -> Bool { 
    switch (lhs, rhs) { 
    case (.Default, .Default): 
     return true 

    case let (.Error(lhsErrorState), .Error(rhsErrorState)): 
     return lhsErrorState == rhsErrorState 

    default: 
     return false 
    } 
} 

注意,在雨燕3.0,你就可以将操作员超负荷放入分机的身体内。

1

您的问题与the thread shown by JAL非常相似,因为您的巢枚举TransformState. ErrorState是Equatable。

您可以编写自己的==,如:

func == (lhs: TransformState, rhs: TransformState) -> Bool { 
    switch (lhs, rhs) { 
    case (.Default, .Default): 
     return true 
    case (.Error(let state1), .Error(let state2)): 
     return state1 == state2 
    default: 
     return false 
    } 
} 
var currentState: TransformState = .Default 

var state = TransformState.Error(.Custom) 

print(state == currentState) //->false 

currentState = .Error(.Custom) 
print(state == currentState) //->true 
1

覆盖==您枚举。

func ==(lhs: TransformState, rhs: TransformState) -> Bool { 
    switch (lhs, rhs) { 
    case (.Default, .Default): 
     return true 

    case (.Error(.Custom), .Error(.Custom)): 
     return true 

    case (.Error(.Default), .Error(.Default)): 
     return true 

    default: 
     return false 
    } 
}