Gibt es eine intelligentere Möglichkeit, dies umzuschreiben?
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
quelle
quelle
Antworten:
Leider können sie nicht. Dies ist eine der besten und gefragtesten Anwendungen von switch-Anweisungen. Hoffentlich hüpfen sie auf den (jetzt) Java (und andere) Zug!
Wenn Sie Kartennamen verwenden, weisen Sie möglicherweise jedem Kartenobjekt einen ganzzahligen Wert zu und schalten Sie diesen ein. Oder vielleicht eine Aufzählung, die als Zahl betrachtet wird und daher eingeschaltet werden kann.
z.B
Auf diese Weise wäre Ace gleich Fall 0, Zwei als Fall 1 usw.
quelle
CardType
kann nicht gleich einem beiliegenden@""
zB sein:[CardType isEqualToString:@"Three"]
Sie können ein Wörterbuch mit Blöcken wie folgt einrichten:
Ersetzen Sie die letzte Zeile durch:
Hoffentlich bringt Apple ein paar neue Tricks bei.
quelle
Für mich ein schöner einfacher Weg:
quelle
Leider können switch-Anweisungen nur für primitive Typen verwendet werden. Sie haben jedoch einige Optionen für die Verwendung von Sammlungen.
Die wahrscheinlich beste Option wäre, jeden Wert als Eintrag in einem NSDictionary zu speichern.
quelle
Ein bisschen spät, aber für jeden in der Zukunft konnte ich das für mich zum Laufen bringen
quelle
Hier ist die intelligentere Art, das zu schreiben. Es ist ein
NSNumberFormatter
im "Zauberstil" zu verwenden :Beachten Sie, dass der Zahlenformatierer möchte, dass die Zeichenfolge in Kleinbuchstaben geschrieben wird. Daher müssen wir dies selbst tun, bevor wir sie an den Formatierer übergeben.
quelle
Es gibt andere Möglichkeiten, dies zu tun, aber
switch
keine davon.Wenn Sie wie in Ihrem Beispiel nur wenige Zeichenfolgen haben, ist der Code, den Sie haben, in Ordnung. Wenn Sie viele Fälle haben, können Sie die Zeichenfolgen als Schlüssel in einem Wörterbuch speichern und den entsprechenden Wert nachschlagen:
quelle
Bei weitem .. mein Favorit "ObjC Add-On" ist
ObjectMatcher
UND es funktioniert auch mit Nicht-Strings ... sogar in Loops!
Das Beste von allem, es gibt so wenige
{...}
‚s,:
‘ s, und()
‚squelle
Objective-c unterscheidet sich in diesem Aspekt nicht von c, es kann nur einschalten, was c kann (und die Preproc-Defs wie NSInteger, NSUInteger, da sie letztendlich nur zu einem integralen Typ typisiert werden).
Wikipedia:
c-Syntax :
Integrale Typen :
quelle
Ich bin etwas spät zur Party, aber um die Frage wie angegeben zu beantworten , gibt es einen intelligenteren Weg:
Beachten Sie, dass
indexOfObject
die Übereinstimmung mitisEqual:
genau wie in der Frage gesucht wird.quelle
Aufbauend auf der bereits veröffentlichten Idee von @Graham Perks wurde eine einfache Klasse entwickelt, um das Einschalten von Zeichenfolgen recht einfach und sauber zu gestalten.
Sie würden es so verwenden:
Der richtige Block wird entsprechend der Zeichenfolge ausgeführt.
Kern für diese Lösung
quelle
Ich kann Cris Antwort auf @ Cris Antwort nicht kommentieren, aber ich möchte das sagen:
Es gibt eine EINSCHRÄNKUNG für die Methode von @ cris:
typedef enum akzeptiert keine alphanumerischen Werte
Also hier ist noch einer:
Link Stack over flow Gehe zu dieser Benutzerantwort "user1717750"
quelle
Viel Spaß beim Codieren .....
quelle