variable - Valor predeterminado de una estructura Objective-C y cómo probar
variable struct c (6)
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 rectángulo vacío es aquel que no tiene área, donde en o ambos lados son cero.
Use en su lugar:
CGRect newRect = CGRectNull;
Estoy tratando de probar si todavía se ha establecido una propiedad. Lo sé con los objetos que tengo:
CGRect ppGoalFrame;
LocalPlaySetup *localPlaySetup;
y puedo probar
if (localPlaySetup == nil)
pero si intento probar el CGRect con == nil o == NULL
if (ppGoalFrame == nil)
yo obtengo
invalid operands to binary == (have ''CGRect'' and ''void *'')
Entonces, ¿el CGRect
"nulo", nulo, nulo ...? antes de que se establezca? Obviamente no puedo comparar CGrect con un puntero void (no puedo usar ppGoalFrame == void
); ¿Hay alguna otra forma de probar esto? El Objective-C hasta ahora es bastante fácil de entender, pero tan pronto como se ve el C, me pierdo un poco.
No creo que puedas hacer una comparación binaria de una estructura C, que es lo que CGRect es . Una búsqueda rápida en Google y la comprobación de la referencia de escritorio de C for Dummies no dieron resultado. Puede declarar CGRect ppGoalFrame, inicializar los miembros de la estructura con los valores predeterminados (si aún no lo están) y probar los miembros de la estructura.
Actualizar Editar: esta pregunta ha sido solicitada para estructuras C.
No hay un valor universal de "nada". No hay nada para los objetos y NULL
para los punteros, pero no hay un equivalente para los tipos de valores simples: siempre tienen algún valor, incluso si no tiene sentido. Puede tomar un valor arbitrario y decir "Voy a llamar a esto el valor nulo para este tipo" (por ejemplo, #define IntNull 4444444
y esperar que algún cálculo nunca devuelva accidentalmente ese valor), pero no existe un valor nulo real.
En el caso de CGRect en particular, Apple usó la táctica de "elegir un valor arbitrario" y definió CGRectNull
, pero las variables de CGRect no están configuradas de manera predeterminada; usted mismo debe configurarlo usted mismo. De forma predeterminada, las variables de instancia de CGRect se establecen en CGRectZero
, pero recuerde que esto es solo una estructura de CGRect normal en la ubicación (0,0) con 0 de ancho y 0 de altura. Y los CGRects locales en una función tienen un valor totalmente impredecible.
Solo los punteros pueden ser nulos. CGRect es una estructura: representa un bloque contiguo de memoria. La única forma de saber si se ha configurado para verificar su contenido.
Apple proporciona un CGRectNull
constante. Puede establecer su variable para esto y usar la función CGRectIsNull para determinar si se ha configurado. CGRectNull
no es lo mismo que CGRectZero
por lo que no debe preocuparse si el valor deseado es cero.
Tenga en cuenta que CGRectNull simplemente contiene una estructura CGRect llena de valores que Apple puede identificar más adelante para la función CGRectIsNull. No es lo mismo nulo que al comparar punteros.
También puede ajustar CGRect en NSValue:
[NSValue valueWithCGRect:CGRectMake(x, y, width, height)]
Y luego evita el valor nil
.
Todas las variables de instancia en una clase Objective-C se inicializan a cero. Entonces todos los punteros son nil
, los números son 0 y las estructuras están puestas a cero. Como CGRect es una estructura simple, se inicializará en origin.x=0, origin.y=0, size.width=0, size.height=0
.
Entonces, para probar si su CGRect
ha sido configurado, necesita compararlo (por valor) a cero. La función CGRectIsEmpty
hará exactamente esto:
if (CGRectIsEmpty(ppGoalFrame))
{
// ...
}