2015-12-10 1 views
1

J'ai un enum défini comme ceci:Impossible d'instancier NSNumber avec la syntaxe stnype @n lors de l'utilisation d'enum?

typedef enum dataTypes{ 
    LOW, 
    MEDIUM, 
    HIGH, 
    MAX_DATA_TYPE 
} dataTypeEnum; 

Je voudrais pouvoir instancier un NSArray de NSNumber s comme ceci:

NSArray * numsToUse = @[@LOW, @MEDIUM]; 

Ce ne compile. Des idées? Dois-je aller avec le clunkier [NSNumber numberWithInt:] pour chacun d'entre eux ou y a-t-il un moyen de contourner cela? (J'ai examiné et rejeté les déclarations #define pour un certain nombre de raisons).

+0

Vous devez utiliser 'typedef NS_ENUM (NSInteger, DataTypeEnum) {..}' pour définir votre ENUM. – orkoden

+0

@orkoden Quelle est la différence et pourquoi NS_ENUM est-il préférable? – helloB

+0

[Voir les Docs d'Apple] (https://developer.apple.com/library/ios/releasenotes/ObjectiveC/ModernizationObjC/AdoptingModernObjective-C/AdoptingModernObjective-C.html) tl: meilleure complétion du code, meilleur type d'information pour le compilateur, better Swift interop – orkoden

Répondre

2

Vous avez juste besoin d'utiliser la syntaxe d'expression:

NSArray * numsToUse = @[@(LOW), @(MEDIUM)]; 
+0

Merci! Un aperçu de pourquoi/comment cela fonctionne? – helloB

+4

Pour ajouter plus d'informations - la syntaxe '@' sans parenthèses ne fonctionne qu'avec des littéraux numériques ou des littéraux 'BOOL'. Toutes les autres expressions numériques nécessitent l'utilisation de parenthèses. – rmaddy

+2

Le "pourquoi" est que entre parenthèses l'expression est évaluée, puis la box NSNumber est appliquée. Vous pouvez également faire '@ (1 + 1)'. –