J'essaye de tester si une propriété a encore été définie. Je sais qu'avec les objets que j'ai:
CGRect ppGoalFrame;
LocalPlaySetup *localPlaySetup;
et je peux tester
if (localPlaySetup == nil)
mais si j'essaye de tester le CGRect avec == nil ou == NULL
if (ppGoalFrame == nil)
Je reçois
invalid operands to binary == (have 'CGRect' and 'void *')
Alors est-ce que CGRect
est "vide", nul, nul ...? avant qu'il ne soit réglé? Évidemment, je ne peux pas comparer CGrect à un pointeur vide (je ne peux pas utiliser ppGoalFrame == void
); y a-t-il une autre façon de tester cela? L'Objective-C jusqu'à présent est assez facile à comprendre mais dès que le C se profile, je me perds un peu.
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 une constante CGRectNull
. Vous pouvez définir votre variable sur 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
donc vous n'avez 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 le même null que lors de la comparaison des pointeurs.
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. Puisque le 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 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 celui qui n'a pas de zone, où sur ou les deux côtés sont zéro.
Utilisez à la place:
CGRect newRect = CGRectNull;
Vous pouvez également envelopper CGRect dans NSValue:
[NSValue valueWithCGRect:CGRectMake(x, y, width, height)]
Et puis évitez la valeur nil
.
Il n'y a pas de valeur universelle du "rien". Il y a nil
pour les objets et NULL
pour les pointeurs, mais il n'y a pas d'équivalent pour les types de valeur simples - ils ont toujours certains valeur, même si c'est juste un non-sens. Vous pouvez prendre une valeur arbitraire et dire "Je vais appeler cela la valeur nulle pour ce type" (disons, #define IntNull 4444444
et j'espère que certains calculs ne retournent jamais accidentellement cette valeur), mais il n'y a pas de vraie valeur nulle.
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 sur cela par défaut - vous avez pour le définir spécifiquement 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 une largeur de 0 et une hauteur de 0. Et les CGRect locaux dans une fonction a une valeur totalement imprévisible.
En fait, il existe une solution évidente et élégante (lol):
SomeStruct someStruct = {0};
Ce qui remplit juste tous les "éléments" de la structure avec des zéros.
Je ne pense pas que vous puissiez faire une comparaison binaire d'une structure C, qui est ce qu'est CGRect . Une recherche rapide sur Google et la vérification du C For Dummies Desk Reference n'ont rien révélé. Vous pouvez déclarer CGRect ppGoalFrame, initialiser les membres de la structure avec des valeurs par défaut (si ce n'est déjà fait) et tester les membres de la structure.
Mettre à jour Edit: This question a été posée pour les structures C.