Pourquoi ce travail ne fonctionne-t-il pas:
NSInteger sectionLocation = 0; NSInteger sectionTitles = 1; NSInteger sectionNotifications = 2; switch (section) { case sectionLocation: // break; case sectionTitles: // break; case sectionNotifications: // break; default: // }
5 Réponses :
Le problème ici est que vous utilisez des variables. Vous ne pouvez utiliser que des constantes dans des relevés de commutation.
faire quelque chose comme p> ou p> et vous serez capable d'utiliser la valeur et ainsi de suite dans votre relevé de commutation. P> p>
Donc, je vais devoir recourir à si ... encore-dire? N'y a-t-il pas un moyen de contourner cela?
Oui, l'utilisation définit, quel est le problème avec ça? :RÉ
Le problème n'est pas le type scalaire, mais que les étiquettes de cas peuvent modifier la valeur quand elles sont des variables comme celle-ci. P>
À toutes fins utiles, le compilateur compile une instruction de commutation en tant qu'ensemble de gotos. Les étiquettes ne peuvent pas être variables. P>
Utilisez un type énuméré ou #defines. P>
La raison est que le compilateur voudra souvent créer une "table de saut" à l'aide de la valeur du commutateur comme clé de cette table et que cela ne peut le faire que s'il s'agit d'une simple valeur entière. Cela devrait fonctionner à la place:
#define sectionLocation 0 #define sectionTitles 1 #define sectionNotifications 2 int intSection = section; switch (intSection) { case sectionLocation: // break; case sectionTitles: // break; case sectionNotifications: // break; default: // }
Si vos valeurs de cas changent vraiment au moment de l'exécution, c'est ce que ... sinon si ... sinon si construit est là pour. P>
ou juste faire ce