如何检查CGPoint是否已初始化?

时间:2012-01-19 15:41:35

标签: objective-c

我想最初将CGPoint属性设置为特定点(屏幕中间)。其他方法可能随后希望更改此属性。我的想法是在getter中将其初始化为空,但是我得到消息无效的参数类型'struct CGPoint'到一元表达式。我也试过使用if property == nil或0但没有欢乐。

有什么想法吗?

-(CGPoint)graphOrigin
{
    // initialise to centre of screen if has not been set
    if(!_graphOrigin) // this expression is causing the problem
    {
        CGPoint origin = CGPointMake(self.bounds.origin.x + self.bounds.size.width / 2, self.bounds.origin.y + self.bounds.size.height / 2);

        _graphOrigin = origin;
    }

return _graphOrigin;

}

6 个答案:

答案 0 :(得分:31)

CGPoint是一个结构,因此您无法将其设置为nil或NULL(它不是指针)。从某种意义上说,真的没有“未初始化”的状态。也许您可以使用{0.0, 0.0}来指定未设置的CGPoint,但这也是一个有效的坐标。或者您可以使用负xy值来标记“未初始化”的点,因为负值不能是有效的绘图点,但这也是一个黑客攻击。

可能你最好的选择是做两件事之一:

  1. 将该属性存储为指向CGPoint的指针。未初始化时,此值可以设置为NULL。当然,您必须担心mallocfree价值。
  2. CGPoint与名为BOOL的{​​{1}}或其他人pointInitialized一起存储,最初设置为NO,但一旦设置为YES,则设置为struct { CGPoint point; BOOL initialized; } pointData; 已初始化。你甚至可以将它包装在一个结构中:

    {{1}}

答案 1 :(得分:21)

更简单的方法是将_graphOrigin初始化为CGRectZero并为此更改if语句:

if (!CGPointEqualToPoint(_graphOrigin, CGPointZero)) {  

}

答案 2 :(得分:11)

CGPoint没有未初始化状态。但是,如果将点(0,0)视为未初始化,则可以使用

if (_graphOrigin.x == 0 && _graphOrigin.y == 0)
{
    ...

这是有效的,因为在初始化Objective-C实例时,其所有ivar都被清除为零位,在CGFloat表示中为0.0。

(注意:即使操作数是CGFloat,==也没问题,因为我们想要与精确的位模式进行比较(忽略-0的问题))

答案 3 :(得分:5)

由于您的上下文中可能存在CGPointZero(0,0)和任何其他值 您可能希望使用以下内容初始化NSValue:

NSValue *pointVal = [NSValue valueWithCGPoint:point];

您可以根据某些条件执行此操作,然后稍后测试NSValue为零。 NSValue也可以添加到一个数组中,这样你就可以得到一个点数组。

稍后要简单地使用:

CGPoint point = [pointVal CGPointValue]; 

答案 4 :(得分:0)

创建两个CGPoint属性,这样他们都是"未初始化"。设置其中一个并使用第二个来检查它们是否相等。

@interface ClassName ()

@property (nonatomic) CGPoint point1;
@property (nonatomic) CGPoint point2;

@end

@implementation ClassName

self.point1 = CGPointMake(69.0f, 180.0f);  //arbitrary numbers

  //if not equal, then if statement proceeds
if (!CGPointEqualToPoint(self.point1, self.point2) {
    //your code here
}

@end

如果您考虑这种方式,那么请尽快。而且我知道你的问题已经得到了回答,但在我想到这一点之前,我遇到了同样的困境。

答案 5 :(得分:0)

static CGPoint kInvalidPoint = {.x = NSIntegerMax, .y = NSIntegerMax};

@implementation MyClass

- init()
{
    self = [super init];
    if (self) {
        _oldPoint = kInvalidPoint;
    }
    return self;
}

- (void)foo
{
    if (CGPointEqualToPoint(self.oldPoint, kInvalidPoint)) {
        // Invalid point.
        return;
    }
}

@end