2015-03-09 3 views
5

Я знаю, что почти аналогичный вопрос задавали ранее, но я не могу его прокомментировать, потому что я здесь для нового. Вот почему я отправляю отдельный вопрос. Также мой вопрос является продолжением предыдущего заданного вопроса и нацелен на более общее решение. То есть ссылка на предыдущий вопрос: How to test equality of Swift enums with associated valuesПерегрузка операторов равенства в быстрых перечислениях со связанными значениями

Я хочу проверить равенство в перечислении с соответствующими значениями:

enum MyEnum { 
    case None 
    case Error 
    case Function(Int) // it is a custom type but for briefness an Int here 
    case ... 
} 

Я попытался настроить функцию перегрузки в виде следующей

func ==(a: MyEnum, b: MyEnum) -> Bool { 
    switch (a,b) { 
    case (.Function(let aa), .Function(let bb)): 
     if (aa==bb) { 
      return true 
     } else { 
      return false 
     } 
    default: 
     if (a == b) { 
      return true 
     } else { 
      return false 
     } 
    } 
} 

Это не дает ошибки времени компиляции, но не работает с bad_exec в текущем процессе. Скорее всего, потому, что тестирование a == b в случае по умолчанию вызывает эту функцию снова. Часть .Function работает так, как ожидалось, но не все остальное ... Итак, список случаев несколько длиннее, как я могу проверить случаи, которые не имеют связанного с ними значения для равенства?

+0

Я просто добавил ответ здесь: HTTP: //stackoverflow.com/a/41034836/2784160 – LShi

ответ

2

В вашей реализации,

if (a == b) { 

рекурсивно снова вызывает тот же == функцию. Это приводит к сбою с переполнением стека.

рабочая реализация бы быть, например:

func ==(a: MyEnum, b: MyEnum) -> Bool { 
    switch (a,b) { 
    case (.Function(let aa), .Function(let bb)): 
     return aa == bb 
    case (.Error, .Error): 
     return true 
    case (.None, .None): 
     return true 
    default: 
     return false 
    } 
} 
+0

К сожалению, вы уже заметили рекурсию (извините за то, что читаете вопрос не достаточно тщательно). Посмотрим, получится ли лучшее решение ... –

+0

Еще спасибо за публикацию этого! Потому что для краткого списка перечислений это, вероятно, лучшее и простое решение. И это прямо. Но если у вас длинный список дел, мне все равно интересно, есть ли более элегантное (и более короткое) решение. Потому что было бы очень много писать для очень простого вопроса ... lhs равно rhs – enovatia

0

Хотя memcmp работы:

func ==(var a: MyEnum, var b: MyEnum) -> Bool { 
    switch (a,b) { 
    case (.Function(let aa), .Function(let bb)): 
     return aa == bb 
    default: 
     return memcmp(&a, &b, sizeof(MyEnum)) == 0 
    } 
} 

Я не рекомендую это :)

Смежные вопросы