2016-08-02 3 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

@ JAL Я видел этот вопрос, и я все еще был смущен, потому что в моем случае это вложенные перечисления. – natecraft1

ответ

2

Вам просто нужно реализовать Equatable для TransformState

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 
    } 
} 

Обратите внимание, что в Swift 3.0, вы будете в состоянии чтобы оператор перегрузился в теле расширения.

1

Ваша проблема очень похожа на the thread shown by JAL, потому что ваше гнездо enum TransformState. ErrorState равносильно.

Вы можете написать свой собственный == как:

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

== Override для перечисления.

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 
    } 
} 
Смежные вопросы