Valeur par défaut d’une structure Objective-C et comment tester

J’essaie de tester si une propriété a déjà été définie. Je sais qu’avec des objects que j’ai:

CGRect ppGoalFrame; LocalPlaySetup *localPlaySetup; 

et je peux tester

 if (localPlaySetup == nil) 

mais si je tente de tester le CGRect avec == nil ou == NULL

 if (ppGoalFrame == nil) 

Je reçois

 invalid operands to binary == (have 'CGRect' and 'void *') 

Le CGRect est- CGRect “vide”, nul, nul …? avant qu’il soit réglé? Évidemment, je ne peux pas comparer CGrect à un pointeur vide (je ne peux pas utiliser ppGoalFrame == void ); existe-t-il une autre façon de tester cela? L’Objective-C est jusqu’ici assez facile à comprendre mais dès que le C se profile, je suis un peu perdu.

Seuls les pointeurs peuvent être nuls. CGRect est une structure – il représente un bloc de mémoire contigu. La seule façon de savoir s’il a été configuré pour vérifier son contenu.

Apple fournit un CGRectNull constant. Vous pouvez définir votre variable à ceci et utiliser la fonction CGRectIsNull pour déterminer si elle a été définie. CGRectNull n’est pas la même chose que CGRectZero . Vous n’avez donc pas à vous inquiéter si la valeur souhaitée est zéro.

Notez que CGRectNull contient simplement une structure CGRect remplie de valeurs que Apple peut identifier plus tard pour la fonction CGRectIsNull. Ce n’est pas la même valeur nulle que lors de la comparaison de pointeurs.

Toutes les variables d’instance d’une classe Objective-C sont initialisées à zéro. Donc, tous les pointeurs sont nil , les nombres sont 0 et les structs sont mis à zéro. Comme CGRect est une structure simple, elle sera initialisée à origin.x=0, origin.y=0, size.width=0, size.height=0 .

Donc, pour tester si votre CGRect a été défini, vous devez le comparer (en valeur) à zéro. La fonction CGRectIsEmpty fera exactement ceci:

 if (CGRectIsEmpty(ppGoalFrame)) { // ... } 

De CGGeometry.h :

 /* Return true if `rect' is empty (that is, if it has zero width or height), false otherwise. A null rect is defined to be empty. */ 

un rectangle vide est un rectangle sans zone, où les deux côtés sont nuls.
Utilisez plutôt:

 CGRect newRect = CGRectNull; 

Il n’y a pas de valeur universelle “rien”. Il y a nil pour les objects et NULL pour les pointeurs, mais il n’y a pas d’équivalent pour les types de valeurs simples – ils ont toujours une certaine valeur, même si ce n’est que du non-sens. Vous pouvez prendre une valeur arbitraire et dire “je vais appeler cela la valeur nulle pour ce type” (par exemple, #define IntNull 4444444 et espérer que certains calculs ne renvoient jamais accidentellement cette valeur), mais il n’y a pas de valeur null réelle.

Dans le cas de CGRect en particulier, Apple a utilisé la tactique “choisir une valeur arbitraire” et défini CGRectNull , mais les variables CGRect ne sont pas définies par défaut – vous devez le définir vous-même. Par défaut, les variables d’instance CGRect sont définies sur CGRectZero , mais rappelez-vous qu’il ne s’agit que d’une structure CGRect normale à l’emplacement (0,0) avec 0 width et 0 height. Et les CGRects locaux dans une fonction ont une valeur totalement imprévisible.

Vous pouvez également envelopper CGRect dans NSValue:

[NSValue valueWithCGRect:CGRectMake(x, y, width, height)]

Et puis évitez la valeur nil .

Je ne pense pas que vous pouvez faire une comparaison binary d’une structure en C, ce qui est ce que CGRect est . Une recherche rapide sur Google et la vérification de la référence du bureau C For Dummies n’ont rien changé. Vous pouvez déclarer CGRect ppGoalFrame, initialiser les membres de la structure avec les valeurs par défaut (s’ils ne le sont pas déjà) et tester les membres de la structure.

Update Edit: Cette question a été posée pour les structures C.