8
votes

Pourquoi ne puis-je pas utiliser une nsinteger dans une déclaration de commutation?

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:
        //
}


0 commentaires

5 Réponses :


2
votes

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 xxx

ou xxx

et vous serez capable d'utiliser la valeur et ainsi de suite dans votre relevé de commutation.


2 commentaires

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É



11
votes

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.

À toutes fins utiles, le compilateur compile une instruction de commutation en tant qu'ensemble de gotos. Les étiquettes ne peuvent pas être variables.

Utilisez un type énuméré ou #defines.


0 commentaires

4
votes

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:
        //
}


0 commentaires

1
votes

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.


0 commentaires

-2
votes

ou juste faire ce xxx


0 commentaires