Sending nil to CGPoint type parameter

后端 未结 2 549
小蘑菇
小蘑菇 2021-01-01 02:23

Suppose I have this method:

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

So I pass the view and a point to te the

相关标签:
2条回答
  • 2021-01-01 02:23

    You can't use nil as a "no point" indicator, because it is only for objects, and CGPoint is a struct. (As dasblinkenlight has already said.)

    In my geometry library, I've defined a "null" CGPoint to use as a "no point" placeholder, and a function to test for it. Since the components of a CGPoint are CGFloats, and floats have a "invalid value" representation already -- NAN, defined in math.h -- I think that's the best thing to use:

    // 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 讨论(0)
  • 2021-01-01 02:39

    CGPoint is a C struct, you cannot pass nil for it. You can create a separate method that does not take the unnecessary CGPoint, and get rid of your if statement, like this:

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

    If you insist on keeping one method, you could designate one point as "special" (say, CGMakePoint(CGFLOAT_MAX, CGFLOAT_MAX)), wrap it in a #define, and use instead of nil.

    Yet another solution would be to wrap your CGPoint in NSValue:

    NSValue *v = [NSValue withPoint:CGMakePoint(12, 34)];
    CGPoint p = [v pointValue];
    
    0 讨论(0)
提交回复
热议问题