2009-05-21 7 views
11

Je fais un chèque dans une application iPhone -Comment tester si une primitive en Objective-C est nulle?

int var; 
if (var != nil) 

Il fonctionne, mais dans le code X cela génère un avertissement « comparaison entre pointeur et entier. » Comment je le répare? Je viens du monde de Java, où je suis sûr que la déclaration ci-dessus échouerait sur la compliation.

Répondre

33

Primitives ne peuvent pas être nil. nil est réservé aux pointeurs vers des objets Objective-C. nil est techniquement un type de pointeur, et les pointeurs de mélange et les entiers sans résultat donneront presque toujours un avertissement de compilateur, à une exception près: il est parfaitement correct de convertir implicitement l'entier 0 en pointeur sans cast.

Si vous voulez faire la distinction entre 0 et « aucune valeur », utilisez la classe NSNumber:

NSNumber *num = [NSNumber numberWithInt:0]; 
if(num == nil) // compare against nil 
    ; // do one thing 
else if([num intValue] == 0) // compare against 0 
    ; // do another thing 
10
if (var) { 
    ... 
} 

Bienvenue dans le monde merveilleux de C. Toute valeur différente de l'entier 0 ou un pointeur nul est vrai.

Mais vous avez un bug: ints ne peut pas être nul. Ce sont des types de valeur comme en Java.

Si vous voulez « boîte » l'entier, alors vous devez lui demander son adresse:

int can_never_be_null = 42; // int in Java 
int *can_be_null = &can_never_be_null; // Integer in Java 
*can_be_null = 0; // Integer.set or whatever 
can_be_null = 0; // This is setting "the box" to null, 
        // NOT setting the integer value 
+0

tout semble fonctionner bien, où est le cas où cela me donnerait des problèmes? juste pour un peu d'arrière-plan - "var" est une propriété dans un objet de domaine. Dans un de mes ViewControllers, j'ai un UISegmentedViewController qui est utilisé pour définir la valeur de "var". Ainsi, avant que l'utilisateur ne sélectionne quoi que ce soit, var n'a pas encore été défini. – bpapa

+0

var == 0 s'il n'a pas encore été défini –

+0

Bien sûr, il a été défini: il a été défini sur une valeur indéfinie. ints ne peut * prendre * que des valeurs intégrales. Vous devriez comparer par rapport à 0 ou utiliser un indicateur BOOL séparé pour déterminer/indiquer si 'var' est valide. –

Questions connexes