Comment puis-je tester si une primitive en Objective-C est nul?
-
23-08-2019 - |
Question
Je fais un chèque dans une application iPhone -
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 Java, où je suis assez sûr que la déclaration ci-dessus échouerait sur compliation.
La solution
Primitives ne peuvent pas être nil
. nil
est réservé pour des pointeurs vers des objets Objective-C. nil
est techniquement un type de pointeur, et le mélange des pointeurs et entiers sera sans fonte entraînera presque toujours dans un avertissement du compilateur, à une exception près:. il est parfaitement correct de convertir implicitement l'entier 0 à un pointeur sans plâtre
Si vous voulez faire la distinction entre 0 et « aucune valeur », utilisez la touche NSNumber
classe :
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
Autres conseils
if (var) {
...
}
Bienvenue dans le monde merveilleux de C. Toute valeur non égale à l'entier 0 ou un pointeur NULL est vrai.
Mais vous avez un bug: ints ne peut pas être nulle. Ils sont les types de valeur comme en Java.
Si vous voulez « boîte » l'entier, alors vous devez 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