2012-08-16 8 views
5

Supongamos que tengo este método:Envío de cero a parámetro de tipo CGPoint

- (void)placeView:(UIView*)theView withCenterIn:(CGPoint)centerPoint; 

Así que pasar de la vista y un punto para el centro de te de la vista.

Pero sucede que no necesito especificar el centro, solo la vista.

Al pasar "nil" se produce un error.

Por favor, sugiera cómo saltear el punto central.

Tenga en cuenta que tengo que usar ese método como este:

- (void)placeView:(UIView*)theView withCenterIn:(CGPoint)centerPoint{ 
    if(centerPoint == nil){//and I understand that it's a wrong comparison, as I cannot pass "nil" to CGPoint 
     //set a random center point 
    } 
    else{ 
     //set that view to the specified point 
    } 
} 

Gracias de antemano

Respuesta

5

CGPoint es un C struct, no se puede pasar nil por ello. Se puede crear un método separado que no toma la innecesaria CGPoint, y deshacerse de su estado de cuenta if, así:

- (void)placeView:(UIView*)theView withCenterIn:(CGPoint)centerPoint{ 
    //set that view to the specified point 
} 

- (void)placeView:(UIView*)theView { 
    //set a random center point 
} 

Si insiste en mantener un método, se podría designar un punto como "especial" (por ejemplo, CGMakePoint(CGFLOAT_MAX, CGFLOAT_MAX)), envuélvalo en un #define y utilícelo en lugar de nil.

Sin embargo, otra solución sería la de envolver su CGPoint en NSValue:

NSValue *v = [NSValue withPoint:CGMakePoint(12, 34)]; 
CGPoint p = [v pointValue]; 
+0

Así que sugieres para hacer 2 métodos diferentes, ¿verdad? –

+0

@ SavaMazăre Correcto, este enfoque es más limpio tanto en su implementación (no es necesario 'si') como en sus llamadores (no es necesario' withCenterIn: nil'). – dasblinkenlight

+0

Entiendo, eso tiene sentido. Pero, ¿qué sucede si necesito especificar 2 puntos diferentes, ejemplo: placeView: witCenterIn: orOriginAt: y estoy comprobando si tengo el centro, trabajo con el centro, si no trabajo con el origen. Estaba pensando en pasar una serie de CGPoints, y comprobar si el objeto en el índice: 0 es nulo, así que no obtuve el centro -> Usaré el origen (suponiendo en realidad una matriz con 2 objetos, uno de ellos será nulo) –

12

No se puede utilizar como un indicador de nil "no tiene sentido", ya que es sólo para los objetos, y CGPoint es un struct. (Como dasblinkenlight ya lo ha dicho)

En mi biblioteca de geometría, he definido un "nulo" CGPoint para usar como marcador de posición "sin punto" y una función para probarlo. Dado que los componentes de un CGPoint son CGFloat s, y float s tener una representación "valor no válido" ya - NAN, definido en math.h - Creo que eso es lo mejor que puede utilizar:

// Get NAN definition 
#include <math.h> 

const CGPoint WSSCGPointNull = {(CGFloat)NAN, (CGFloat)NAN}; 

BOOL WSSCGPointIsNull(CGPoint point){ 
    return isnan(point.x) && isnan(point.y); 
} 
+0

hm .. interesante .. –

Cuestiones relacionadas