2009-08-30 6 views

Répondre

7

énumérations en Objective-C sont exactement les mêmes que celles en C. Chaque élément de votre énum reçoit automatiquement une valeur entière, par défaut commençant par zéro.

Pour l'exemple fourni: UIViewAnimationCurveEaseInOut serait 0; UIViewAnimationCurveEaseIn serait 1, et ainsi de suite.

Vous pouvez spécifier la valeur pour l'ENUM si nécessaire:

typedef enum { 
    UIViewAnimationCurveEaseInOut, 
    UIViewAnimationCurveEaseIn = 0, 
    UIViewAnimationCurveEaseOut, 
    UIViewAnimationCurveLinear 
} UIViewAnimationCurve; 

Ce résultat de ceci serait: UIViewAnimationCurveEaseInOut est 0; UIViewAnimationCurveEaseIn est 0; UIViewAnimationCurveEaseOut est 1; etc. Cependant, pour des raisons de base, vous ne devriez pas avoir besoin de faire quelque chose comme ça; il vous donne juste quelques informations utiles à jouer avec.

Il convient de noter, d'après ce qui précède, qu'une énumération ne peut pas être considérée comme une valeur unique; différents identifiants d'énumération peuvent être égaux en valeur l'un par rapport à l'autre. L'ajout d'un élément enum à un NSArray est aussi simple que l'ajout d'un nombre entier. La seule différence serait que vous utilisiez l'identificateur enum à la place.

[myArray addObject:[NSNumber numberWithInt:UIViewAnimationCurveEaseInOut]]; 

Vous pouvez le vérifier par vous-même simplement chaque sortie ENUM à la console et vérifier la valeur qu'il vous fournit. Cela vous donne l'opportunité d'étudier les détails de son fonctionnement. Mais pour la plupart, vous n'aurez pas vraiment besoin de savoir au jour le jour.

1

Les énumérations dans Objective-C sont les mêmes que les énumérations dans la vanille C. C'est juste un int. Si vous utilisez un NSArray, il attend un pointeur et vous obtiendrez un avertissement si vous essayez d'ajouter un entier à elle:

NSMutableArray *myArray = [[NSMutableArray alloc] init]; 
[myArray addObject:UIViewAnimationCurveEaseInOut]; 

// Last line results in: 
// warning: passing argument 1 of 'addObject:' makes 
// pointer from integer without a cast 
4

énumérations sont généralement int valeurs. Vous pouvez les stocker dans un tableau en les enveloppant dans un NSNumber:

[myMutableArray addObject:[NSNumber numberWithInt:myAnimationCurve]]; 

... puis les RÉCUPÉRER comme ceci:

UIViewAnimationCurve myAnimationCurve = [[myMutableArray lastObject] intValue]; 
1

Si vous stockez une grande collection d'entiers 32 bits, pensez à utiliser le type de collection CF approprié plutôt que le type de collection NS. Ils vous permettent de transmettre des méthodes de conservation personnalisées, ce qui élimine le besoin de mettre en boîte chaque entier ajouté à la collection. Par exemple, supposons que vous vouliez un tableau de nombres entiers de 32 bits. Par exemple, disons que vous voulez un tableau d'entiers 32 bits. Utilisation:

CFMutableArrayRef arrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL); 

Le dernier paramètre indique au tableau de ne pas conserver/libérer les "adresses" que vous lui transmettez. Alors, quand vous faites quelque chose comme ceci:

CFArrayAppendValue(arrayRef, 1); 

Qu'est-ce que le tableau pense est que vous passez dans un pointeur vers un objet vivant à l'adresse de mémoire 0x1.Mais puisque vous lui avez dit de ne pas appeler retain/release sur ce pointeur, il est traité comme un int standard par la collection. FWIW, pour une valeur éducative, standard NSMutableArrays ont des types CF équivalents. Grâce à pontage sans frais, vous pouvez utiliser la collection CF comme une collection standard Fondation:

CFMutableArrayRef arrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, kCFTypeArrayCallbacks); 
NSMutableArray *array = (NSMutableArray *)arrayRef; 
[array addObject:@"hi there!"]; 
NSLog(@"%@", [array objectAtIndex:0]); // prints "hi there!" 

Vous pouvez appliquer les mêmes astuces pour les dictionnaires (avec CFDictionary/CFMutableDictionary), jeux (cfset/CFMutableSet), etc.

Questions connexes