38 votes

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

Je suis en train de tester si une propriété a été définie. Je sais qu'avec les objets que j'ai obtenu:

CGRect ppGoalFrame;
LocalPlaySetup *localPlaySetup;

et je peux tester

if (localPlaySetup == nil)

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

if (ppGoalFrame == nil)

Je reçois

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

Donc, est l' CGRect "nul", nul, nul...? avant d'être ensemble? Évidemment, je ne peux pas comparer CGrect à un pointeur void (je ne peux pas utiliser ppGoalFrame == void); est-il un autre moyen de tester cela? L'Objective-C pour l'instant est assez facile à comprendre, mais dès que le C les métiers à tisser, je suis un peu perdu.

89voto

Andrew Points 1459

Seuls les pointeurs peuvent être null. CGRect est une structure (struct) - il s'agit d'un bloc contigu de mémoire. La seule façon de savoir si elle a été définie afin de vérifier son contenu.

Apple fournit une constante CGRectNull. Vous pouvez définir votre variable et utilisent le CGRectIsNull fonction pour déterminer si elle a été définie. CGRectNull n'est pas le même que CGRectZero de sorte que vous devez vous inquiétez pas si la valeur recherchée est égale à zéro.

Notez que CGRectNull contient simplement une CGRect struct rempli avec les valeurs qu'Apple puisse les identifier pour les CGRectIsNull fonction. Ce n'est pas la même valeur null comme lors de la comparaison de pointeurs.

44voto

gavinb Points 9237

Toutes les variables d'instance d'une classe Objective-C sont initialisées à zéro. Ainsi, tous les pointeurs sont nil , les nombres sont 0 et les structures sont mises à zéro. Comme CGRect est une structure simple, il sera initialisé à 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 (par valeur) à zéro. La fonction CGRectIsEmpty fera exactement cela:

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

5voto

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 qui n'a pas d'aire, où les deux côtés sont nuls.
Utilisez plutôt:

 CGRect newRect = CGRectNull;
 

2voto

Chuck Points 138930

Il n'est pas universelle "rien" de la valeur. Il y a nil pour les objets et NULL pour les pointeurs, mais il n'y a pas d'équivalent pour la plaine des types de valeur - ils toujours ont quelque valeur, même si c'est juste absurde. Vous pouvez prendre une valeur arbitraire et dire "je vais l'appeler ce que la valeur null pour ce type" (par exemple, #define IntNull 4444444 et l'espérance de certains calculs ne jamais accidentellement retourne cette valeur), mais il n'y a pas de réelle valeur null.

Dans le cas de CGRect en particulier, Apple a utilisé le "choisir une valeur arbitraire" tactique et définis CGRectNull, mais CGRect variables ne sont pas définies pour que, par défaut, vous devez expressément définir vous-même. Par défaut, CGRect les variables d'instance sont fixés à l' CGRectZero, mais n'oubliez pas que c'est juste normal CGRect struct à la position (0,0) 0 largeur et 0 hauteur. Et locales CGRects dans une fonction totalement imprévisible valeur.

2voto

Carlos Ricardo Points 1204

Vous pouvez également intégrer CGRect dans NSValue:

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

Et puis évitez la valeur nil .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X