5

假设我有这个方法:

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

所以我通过视图和一个点到视图的中心。

但碰巧我不需要指定中心,只需要指定视图。

传递“nil”会导致错误。

请建议如何跳过通过中心点。

请记住,我需要像这样使用该方法:

- (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
    }
}

提前致谢

4

2 回答 2

13

您不能将nil其用作“无意义”指示器,因为它仅用于对象,并且CGPointstruct. (正如 dasblinkenlight 已经说过的那样。)

在我的几何库中,我定义了一个“null”CGPoint用作“no point”占位符,以及一个对其进行测试的函数。由于 a 的组件CGPointCGFloats,并且floats 已经具有“无效值”表示形式 -- NAN,在 math.h 中定义 -- 我认为这是最好的使用方法:

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

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

BOOL WSSCGPointIsNull( CGPoint point ){
    return isnan(point.x) && isnan(point.y);
}
于 2012-08-16T18:05:01.163 回答
5

CGPoint是一个 C struct,你不能通过nil它。您可以创建一个不采用不必要的单独方法,CGPoint并摆脱您的if声明,如下所示:

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

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

如果您坚持保留一种方法,则可以将一个点指定为“特殊”(例如,CGMakePoint(CGFLOAT_MAX, CGFLOAT_MAX)),将其包装在 a 中#define,并使用而不是nil.

另一种解决方案是将你的包装CGPointNSValue

NSValue *v = [NSValue withPoint:CGMakePoint(12, 34)];
CGPoint p = [v pointValue];
于 2012-08-16T12:34:54.793 回答