2015-03-09 12 views
5

Wiem, że prawie podobne pytanie zostało zadane wcześniej, ale nie jestem w stanie tego skomentować, ponieważ jestem tu nowy. Z tego powodu publikuję pytanie separatystyczne. Również moje pytanie jest rozszerzeniem do poprzedniego pytania i ma na celu bardziej ogólne rozwiązanie. To jest link do poprzedniego pytania: How to test equality of Swift enums with associated valuesPrzeciążanie operatora równości w szybkich podsumowaniach z powiązanymi wartościami

Chcę przetestować równość w enum z wartościami powiązanymi:

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

próbowałem skonfigurować funkcję przeciążenia jak poniższy

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

Nie daje to błędu podczas kompilacji, ale kończy się niepowodzeniem z bad_exec w uruchomionym procesie. Najprawdopodobniej dlatego, że testujemy a == bw domyślnym przypadku, wywołuje samą funkcję ponownie. Część .Function działa zgodnie z oczekiwaniami, ale nie reszta ... Tak więc lista spraw jest nieco dłuższa, jak mogę przetestować przypadki, które nie mają z nimi powiązanej wartości dla równości?

+0

Właśnie dodano odpowiedź tutaj: http: //stackoverflow.com/a/41034836/2784160 – LShi

Odpowiedz

2

W implementacji,

if (a == b) { 

rekurencyjnie ponownie wywołuje samą == funkcję. To w końcu zawiesza się z przepełnieniem stosu.

Implementacja pracy byłoby na przykład:

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

Ups, już zauważyłeś rekursję (przepraszam za przeczytanie pytania niezbyt dokładnie). Zobaczmy, czy pojawi się lepsze rozwiązanie ... –

+0

Nadal dziękuję za opublikowanie tego! Ponieważ na krótką listę enum jest to prawdopodobnie najlepsze i proste rozwiązanie. I to jest proste. Ale jeśli masz długą listę przypadków, nadal zastanawiam się, czy istnieje bardziej eleganckie (i krótsze) rozwiązanie. Ponieważ byłoby to dużo pisania na bardzo proste pytanie ... lhs jest równe rhs – enovatia

0

Chociaż memcmp utwory:

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

Nie polecam tego :)

Powiązane problemy