Czy istnieje bardziej inteligentny sposób na przepisanie tego?
if ([cardName isEqualToString:@"Six"]) {
[self setValue:6];
} else if ([cardName isEqualToString:@"Seven"]) {
[self setValue:7];
} else if ([cardName isEqualToString:@"Eight"]) {
[self setValue:8];
} else if ([cardName isEqualToString:@"Nine"]) {
[self setValue:9];
}
objective-c
switch-statement
James Raitsev
źródło
źródło
Odpowiedzi:
Niestety nie mogą. Jest to jedno z najlepszych i najbardziej poszukiwanych zastosowań instrukcji przełącznika, więc miejmy nadzieję, że wskoczą na (obecnie) Java (i inne) modę!
Jeśli tworzysz nazwy kart, przypisz każdemu obiektowi karty wartość całkowitą i włącz ją. A może wyliczenie, które jest traktowane jako liczba i dlatego można je włączyć.
na przykład
W ten sposób as byłby równy przypadkowi 0, dwa przypadkowi 1 itd.
źródło
CardType
nie może równać się żadnemu załączonemu@""
np .:[CardType isEqualToString:@"Three"]
Możesz skonfigurować słownik bloków, na przykład:
Aby mieć sekcję „domyślną”, zamień ostatni wiersz na:
Miejmy nadzieję, że Apple nauczy „zamiany” kilku nowych sztuczek.
źródło
Dla mnie miły, łatwy sposób:
źródło
Niestety instrukcji switch można używać tylko w przypadku typów pierwotnych. Masz jednak kilka opcji korzystania z kolekcji.
Prawdopodobnie najlepszą opcją byłoby przechowywanie każdej wartości jako pozycji w NSDictionary.
źródło
Trochę późno, ale dla każdego w przyszłości udało mi się to zrobić dla mnie
źródło
Oto bardziej inteligentny sposób, aby to napisać. Używa się znaku
NSNumberFormatter
w stylu „spell-out” :Zwróć uwagę, że program formatujący liczby chce, aby ciąg był zamieniany na małe litery, więc musimy to zrobić sami przed przekazaniem go do programu formatującego.
źródło
Są na to inne sposoby, ale
switch
nie jest jednym z nich.Jeśli masz tylko kilka ciągów, jak w przykładzie, kod, który masz, jest w porządku. Jeśli masz wiele przypadków, możesz przechowywać ciągi jako klucze w słowniku i wyszukać odpowiednią wartość:
źródło
DALEKO .. moim ULUBIONYM "Dodatkiem ObjC" jest
ObjectMatcher
I działa z elementami niebędącymi łańcuchami, ZBYT ... nawet w pętlach!
Najlepsze jest to, że tak mało
{...}
„s,:
” s, a()
„sźródło
Objective-c nie różni się od c w tym aspekcie, może tylko włączać to, co c może (i preproc def jest jak NSInteger, NSUInteger, ponieważ ostatecznie są one po prostu zdefiniowane jako typ całkowity).
Wikipedia:
c składnia :
Typy całkowe :
źródło
Trochę spóźniłem się na imprezę, ale aby odpowiedzieć na powyższe pytanie , jest bardziej inteligentny sposób:
Zauważ, że
indexOfObject
będzie szukać dopasowania używającisEqual:
, dokładnie tak, jak w pytaniu.źródło
Opierając się na opublikowanym wcześniej pomyśle @Graham Perks, zaprojektowano prostą klasę, dzięki której przełączanie łańcuchów jest dość proste i przejrzyste.
Używałbyś tego w ten sposób:
Odpowiedni blok zostanie wykonany zgodnie z łańcuchem.
Streszczenie tego rozwiązania
źródło
Nie mogę skomentować odpowiedzi Crisa w odpowiedzi @Cris, ale chciałbym powiedzieć, że:
Metoda @ cris ma OGRANICZENIE:
typedef enum nie przyjmuje wartości alfanumerycznych
Więc oto kolejny:
Link Stack over flow Przejdź do odpowiedzi użytkownika „user1717750”
źródło
Miłego kodowania .....
źródło