web-dev-qa-db-fra.com

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

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.

38
typeoneerror

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.

89
Andrew

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))
{
    // ...
}
45
gavinb

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;
5
Martin Bissegger

Vous pouvez également envelopper CGRect dans NSValue:

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

Et puis évitez la valeur nil.

2
Carlos Ricardo

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.

2
Chuck

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.

1
Nikita

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.

0
C.D. Reimer