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

Ala*_*lan 21 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;
Run Code Online (Sandbox Code Playgroud)

}

mip*_*adi 31

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

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

  1. 将属性存储为指向a的指针CGPoint.NULL未初始化时,可以将此值设置为.当然,你不必担心malloc荷兰国际集团和free荷兰国际集团的价值.
  2. 存储在最初设置为CGPointBOOL被调用者pointInitialized或某些人的旁边NO,但是YES一旦初始化该点就设置为.你甚至可以将它包装在一个结构中:

    struct {
        CGPoint point;
        BOOL initialized;
    } pointData;
    
    Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个答案,因为**{0.0,0.0}**是一个真正存在且有效的坐标.将其用作空点可能会破坏程序逻辑. (4认同)

Fra*_*eau 21

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

if (!CGPointEqualToPoint(_graphOrigin, CGPointZero)) {  

}
Run Code Online (Sandbox Code Playgroud)


ken*_*ytm 11

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

if (_graphOrigin.x == 0 && _graphOrigin.y == 0)
{
    ...
Run Code Online (Sandbox Code Playgroud)

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

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

  • (0,0)是有效坐标 (10认同)

Zig*_*rth 5

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

NSValue *pointVal = [NSValue valueWithCGPoint:point];
Run Code Online (Sandbox Code Playgroud)

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

为了明白这一点,只需使用:

CGPoint point = [pointVal CGPointValue]; 
Run Code Online (Sandbox Code Playgroud)