À l'aide d'un NSString dans une instruction switch
Est-il possible d'utiliser un NSString
dans un switch
déclaration?
Ou est-il préférable de l'utiliser juste if
/else if
?
- vous pouvez peut-être arriver à quelque chose avec enum
- Ce sujet de la commutation sur la table de hachage (int) valeur des cordes?
- Voir aussi stackoverflow.com/questions/8161737/...
- Suffit d'utiliser des parenthèses, comme décrit hare : stackoverflow.com/questions/16676313/...
Vous devez vous connecter pour publier un commentaire.
commutateur de déclaration de constantes entières pour ce type de cas, pour NSString ne peut pas être utilisé ici, il semble donc que vous devez aller pour si/d'autre option.
Un point de plus est, vous devez comparer NSStrings à l'aide de isEqualToString: ou comparer: la méthode, de sorte que même si le pointeur de valeurs ont été autorisés pour la mise en marche des cas, vous ne pourriez pas utiliser de toute façon
[nil isEqualToString:nil]
-YES
ouNO
?- Je utiliser ces macros dans mon application.
__COUNTER__
pour créer un cas de l'étiquette qui vous permet d'avoir un code qui ressemble beaucoup plus à une véritable instruction switch. Enfin, je voudrais préfixe vos macros pour s'assurer qu'ils ne sont pas en conflit, un nom commeDEFAULT
est sûr de conflit avec une bibliothèque quelque part.Réponse et le soutien de @Cœur de la réponse.. Ici c'est la même chose, mais écrit dans Xcode 4.4+ /
clang
/Quelle que soit "la syntaxe littérale" qui est encore plus proche à une simple urnaryif, else
comparaison (et c'est le point, n'est-il pas.....)ou dire, vous souhaitez effectuer un sélecteur de fonction sur le titre d'un bouton...
Bref, comme
w.string = kIvar == 0 ? @"StringA" : @"StringB";
, et d'autant plus utile, que vous pouvez pousser les blocs de là, sans même une pensée de certains terrible (et limité, et alambiqué)@selector
!EDIT: C'est plus évidemment construit en tant que tel:
➜
*** You got it! ***
➜
*** You lose!!! ***
➜
*** Not sure! ***
Je dois l'avouer, je suis embarrassante EN ce type syntaxique de la bêtise.
Une autre option est d'oublier ce que la chaîne est.. juste l'exécuter, lol...
ou la prise de l'INTERFACE utilisateur de la parole, littéralement..
do:
est une catégorie sur NSArray...- (void)do:(void (^)(id obj))block { for(id obj in self) block(obj); }
[array performBlock:^...]
Instruction Switch ne fonctionne pas avec NSString: il fonctionne uniquement avec les int.
If/Else est trop de code et ne sont souvent pas optimale.
Solution optimale consiste à utiliser un NSDictionary indexés par le NSString (ou autres objets) possibilités. Ensuite, vous accédez directement sur la droite de la valeur/fonction.
L'exemple 1, lorsque vous voulez tester @"A" ou"B" et d'effectuer methodA ou methodB:
Exemple 2, si vous voulez tester par @"A" ou"B" et d'effectuer blockA ou blockB:
dispatch_block_t
peut être plus lisible que((void (^)())
.((void (^) ())
ressemble a aucun sens pour moi, comme le font tous les des apple des exemples. Est-il de l'espoir pour un dumdumb comme moi?typedef
s sont faites pour que personne ne veut lire que à chaque fois. Bloc de déclarations sont comme des pointeurs de fonction, de manière connue, la moins compréhensible déclarations, on peut faire dans C. Lire antlr.org/wiki/display/CS652/How+À+Lire+C+Déclarations, la compréhension que le^
n'est pas listée ici, mais indique un Bloc.inspiré par alex gray, j'ai créé une catégorie de méthode, qui s'applique enchaîné les filtres à son objet:
.h
.m
Vous pouvez l'utiliser comme
mais vous pouvez aussi faire plus de trucs compliqués, comme appliqués chianed calculs:
Je sais que je suis un peu en retard à la fête, mais voici ma présentation pour un objectif-c de l'instruction switch. C'est un peu complexe, donc en tenir avec le laid macros.
Caractéristiques:
NSString
(à l'aide de la-isEqual:
sélecteur)struct
s (comme ils n'ont pas de==
opérateur)break
n'est pas nécessaire)break
n'est pas nécessaire)____dontuse_switch_var
(tous les autres sont dans la statique de la portée et peut être écrasé dans la portée locale)__weak
références)Inconvénients:
NSThread
assez largement.{
ou}
, Xcode n'aime pas le format des déclarations correctement (ce qui est dû à l'implicitegoto
étiquette là..m
fichier de travail, pourNSValue
faible refs)Exemple:
Sans plus tarder, voici le (vilain) code:
OBJC_SWITCH.h:
Je ne vais pas vous fournir de la documentation à ce, car il est auto-explicatif. Si c'est vraiment difficile à comprendre, à laisser un commentaire & je vais documenter le code.
NSValue+WeakRef.h:
NSValue+WeakRef.m:
Que tout le monde l'a noté, il est probablement plus facile de simplement utiliser si/d'autre, mais vous peut créer quelque chose qui ressemble beaucoup à une instruction switch. J'ai créé un projet sur GitHub qui fait exactement cela: WSLObjectSwitch. Il est assez naïf de mise en œuvre, il n'a pas d'optimiser l'utilisation de tables de hachage, etc., mais il fonctionne.
C'est généralement là que j'utilise quelque chose comme un enum. Si je dois gérer beaucoup de valeurs, je viens de créer un enum avec le même nom que la chaîne je serait passé autrement et de le transmettre, par exemple:
vous pouvez facilement basculer entre les boutons pour les différentes actions à l'aide de leurs tags.
Exemple :
}