Existe-t-il un moyen plus intelligent de réécrire cela?
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
la source
la source
Réponses:
Malheureusement, ils ne peuvent pas. C'est l'une des utilisations les meilleures et les plus recherchées des instructions switch, alors j'espère qu'ils vont dans le train en marche (maintenant) Java (et autres)!
Si vous faites des noms de cartes, attribuez peut-être à chaque objet carte une valeur entière et activez-la. Ou peut-être une énumération, qui est considérée comme un nombre et peut donc être activée.
par exemple
Fait de cette façon, Ace serait égal au cas 0, Deux au cas 1, etc.
la source
CardType
ne peut être égal à aucun élément inclus,@""
par exemple:[CardType isEqualToString:@"Three"]
Vous pouvez configurer un dictionnaire de blocs, comme ceci:
Pour avoir une section «par défaut», remplacez la dernière ligne par:
Espérons qu'Apple apprendra à «changer» quelques nouvelles astuces.
la source
Pour moi, un moyen simple et agréable:
la source
Malheureusement, les instructions switch ne peuvent être utilisées que sur les types primitifs. Cependant, vous avez quelques options en utilisant les collections.
La meilleure option serait probablement de stocker chaque valeur en tant qu'entrée dans un NSDictionary.
la source
Un peu tard mais pour n'importe qui dans le futur, j'ai pu faire en sorte que cela fonctionne pour moi
la source
Voici la manière la plus intelligente d'écrire cela. Il s'agit d'utiliser un
NSNumberFormatter
dans le "style orthographique" :Notez que le formateur de nombres veut que la chaîne soit en minuscules, nous devons donc le faire nous-mêmes avant de la transmettre au formateur.
la source
Il existe d'autres moyens de le faire, mais ce
switch
n'est pas l'un d'entre eux.Si vous n'avez que quelques chaînes, comme dans votre exemple, le code que vous avez est correct. Si vous avez de nombreux cas, vous pouvez stocker les chaînes sous forme de clés dans un dictionnaire et rechercher la valeur correspondante:
la source
DE FAR .. mon "Module complémentaire ObjC" FAVORI est
ObjectMatcher
ET ça marche avec des non-cordes, TROP ... en boucles, même!
Mieux encore, il y a SI peu
{...}
de:
, de et()
dela source
Objective-c n'est pas différent de c dans cet aspect, il ne peut activer que ce que c peut (et les définitions de préproc comme NSInteger, NSUInteger, puisqu'elles sont finalement simplement typées en un type intégral).
Wikipédia:
syntaxe c :
Types intégraux :
la source
Je suis un peu en retard à la fête, mais pour répondre à la question comme indiqué , il existe un moyen plus intelligent:
Notez que
indexOfObject
recherchera la correspondance en utilisantisEqual:
, exactement comme dans la question.la source
S'appuyant sur l'idée @Graham Perks publiée plus tôt, a conçu une classe simple pour rendre le changement de chaîne assez simple et propre.
Vous l'utiliseriez comme ceci:
Le bloc correct s'exécutera selon la chaîne.
Gist pour cette solution
la source
Je ne peux pas commenter la réponse de cris sur la réponse @Cris, mais je voudrais dire que:
Il existe une LIMITATION pour la méthode de @ cris:
typedef enum ne prendra pas de valeurs alphanumériques
Alors en voici un autre:
Link Stack over flow Aller à la réponse de cet utilisateur "user1717750"
la source
Profitez du codage .....
la source