43 votes

Iteration sur enum en Objective C ?

J'ai

enum Colour {
    white,
    pink,
    yellow,
    blue
} Colour;

et je voudrais faire quelque chose comme ça :

for (int colour in Colour){
    // Do something here.
}

Puis-je le faire et si oui, comment ? Merci pour votre aide !

1 votes

Duplicata possible de Boucler sur les valeurs de l'enum

154voto

Gobra Points 2748

Bien que la question ait déjà reçu une réponse, voici mes deux cents :

enum Colour {
    white = 0,
    pink,
    yellow,
    blue,

    colorsCount // since we count from 0, this number will be blue+1 and will be actual 'colors count'
} Colour;

for (int i = 0; i < colorsCount; ++i)
  someFunc((Colour)i);

Je suppose que ce n'est pas si mal et que c'est assez proche de l'énumération rapide que vous souhaitez.

0 votes

C'est en fait ce que j'ai fini par mettre en œuvre, merci de le poster !

1 votes

Si simple et pourtant si génial ;)

0 votes

J'ai des erreurs parce que typedef ed mon enum. Existe-t-il une solution de contournement pour cette situation ?

18voto

DatProgram Points 1683

Une énumération vient du C alors que l'énumération rapide a été un ajout de l'Objective-C 2.0 ils ne fonctionnent pas ensemble.

Type existingItem;
for ( existingItem in expression ) { statements }

L'expression doit être conforme au protocole NSFastEnumeration et être un objet ! Les "éléments" d'une énumération ne sont pas des objets.

voir ce lien pour plus d'informations Documents d'énumération rapide d'Apple

Vérifiez cet exemple pour voir comment l'énumération rapide fonctionne :

NSArray *array = [NSArray arrayWithObjects:
        @"One", @"Two", @"Three", @"Four", nil];

for (NSString *element in array) {
    NSLog(@"element: %@", element);
}

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
    @"quattuor", @"four", @"quinque", @"five", @"sex", @"six", nil];

NSString *key;
for (key in dictionary) {
    NSLog(@"English: %@, Latin: %@", key, [dictionary objectForKey:key]);
}

0 votes

Je ne le fais pas mais il ne me laisse le faire qu'après 5 minutes apparemment ; )

0 votes

Dans cette réponse, je sais quelle valeur est la valeur de l'indice que je veux aussi comment puis-je trouver s'il vous plaît aide Merci.

13voto

L'élément "Count" dans l'enum est intéressant, mais il vous permettra d'obtenir "Not all switch cases were handled" dans l'enum. switch à moins que vous ne gériez cet élément "count" dans celui-ci. Une meilleure solution consiste à utiliser des alias pour le premier et le dernier élément :

enum Colour {
    firstColour = 0,

    white = firstColour,
    pink,
    yellow,
    blue,

    lastColour = blue
} Colour;

for (int i = firstColour; i <= lastColour; ++i) {

}

0 votes

Blue sera viré deux fois

2 votes

@OlSen nope, comme blue == lastColour

5voto

chunkyguy Points 1146

Pour les cas où je ne suis pas l'auteur de l'énumération, je procède comme suit. Je pense que c'est assez sûr pour l'avenir, car cela ne se soucie pas de la façon dont les types d'énumération sont réellement mis en œuvre.

    UISwipeGestureRecognizerDirection allDirections[] = {
        UISwipeGestureRecognizerDirectionDown,
        UISwipeGestureRecognizerDirectionLeft,
        UISwipeGestureRecognizerDirectionRight,
        UISwipeGestureRecognizerDirectionUp
    };

    for (int i = 0; i < sizeof(allDirections)/sizeof(allDirections[0]); ++i) {
        UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(onSwipe:)];
        swipeGesture.direction = allDirections[i];
        [self addGestureRecognizer:swipeGesture];
    }

5voto

Azeven Points 30

Je suis venu sur ce poste pour répondre à cette question également. La réponse de Gobra est excellente. Mais mon nombre d'éléments peut fluctuer, et correspondre à une valeur stockée, donc pour être sûr que le compte "colorsCount" n'est ou n'a jamais été une valeur valide, j'ai fini par implémenter ce qui suit et je voulais ajouter à la discussion :

MYColor.h

typedef NS_ENUM( NSInteger, MYColorType )
{
    MYColorType0 = 0,
    MYColorType1,
    MYColorType2,
    MYColorType3
};

static inline MYColorType MYColorTypeFirst() { return MYColorType0; }
static inline MYColorType MYColorTypeLast() { return MYColorType3; }

ViewController.m

for ( int i = MYColorTypeFirst(); i <= MYColorTypeLast(); i++ )
{
    MYColor * color = [[MYColor alloc] initWithType:i];
    ...
}

L'ajout notable étant la définition de MYColorTypeFirst() et MYColorTypeLast(), qui est utilisée dans l'itération for(), placée près de la définition de l'enum pour des raisons de maintenabilité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X