2016-08-02 208 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 
    } 
}