Objective-C结构的默认值以及如何测试

问题描述 投票:38回答:7

我正在尝试测试是否已经设置了属性。我知道我拥有的物品:

CGRect ppGoalFrame;
LocalPlaySetup *localPlaySetup;

我可以测试一下

if (localPlaySetup == nil)

但如果我尝试使用== nil或== NULL测试CGRect

if (ppGoalFrame == nil)

我明白了

invalid operands to binary == (have 'CGRect' and 'void *')

那么CGRect“void”,null,nil ......?在它设定之前?显然我无法将CGrect与void指针进行比较(我不能使用ppGoalFrame == void);还有另一种测试方法吗?到目前为止Objective-C很容易理解,但是一旦C出现,我就会有点迷失。

c objective-c struct default-value
7个回答
88
投票

只有指针可以为null。 CGRect是一个结构 - 它代表一个连续的内存块。判断是否已将其设置为检查其内容的唯一方法。

Apple确实提供了恒定的CGRectNull。您可以将变量设置为this并使用CGRectIsNull函数来确定它是否已设置。 CGRectNullCGRectZero不同,所以如果期望的值为零,您不必担心。

请注意,CGRectNull只包含一个CGRect结构,该结构填充了Apple稍后可以为CGRectIsNull函数标识的值。它与比较指针时的null不同。


45
投票

Objective-C类中的所有实例变量都初始化为零。所以所有指针都是nil,数字是0,结构是零。由于CGRect是一个普通的结构,它将初始化为origin.x=0, origin.y=0, size.width=0, size.height=0

因此,要测试您的CGRect是否已设置,您需要将其(按值)与零进行比较。 CGRectIsEmpty函数将完成以下操作:

if (CGRectIsEmpty(ppGoalFrame))
{
    // ...
}

5
投票

来自CGGeometry.h

/* Return true if `rect' is empty (that is, if it has zero width or height),
   false otherwise. A null rect is defined to be empty. */

空矩形是没有区域的矩形,其中或两侧为零。 改为使用:

CGRect newRect = CGRectNull;

2
投票

没有普遍的“无”价值。对象有nil,指针有NULL,但普通值类型没有等价物 - 它们总是有一些价值,即使它只是无意义。您可以采用任意值并说“我将这称为此类型的空值”(例如,#define IntNull 4444444并希望某些计算从不会意外地返回该值),但是没有真正的空值。

特别是在CGRect的情况下,Apple使用“选择一个任意值”的策略并定义了CGRectNull,但是CGRect变量默认情况下没有设置 - 你必须自己专门设置它。默认情况下,CGRect实例变量设置为CGRectZero,但请记住,这只是位置(0,0)的正常CGRect结构,其中0宽度和0高度。函数中的本地CGRect具有完全不可预测的值。


2
投票

您也可以在NSValue中包装CGRect:

[NSValue valueWithCGRect:CGRectMake(x, y, width, height)]

然后避免nil值。


0
投票

我不认为你可以做一个C结构的二元比较,这是what CGRect is。快速的谷歌搜索和检查C For Dummies Desk Reference没有改变任何东西。您可以声明CGRect ppGoalFrame,使用默认值初始化结构成员(如果它们尚未存在),并测试结构成员。

更新编辑:这个question has been asked用于C结构。


0
投票

实际上有一个明显而优雅的解决方案(笑):

SomeStruct someStruct = {0};

这只是用零填充结构的所有“元素”。

© www.soinside.com 2019 - 2024. All rights reserved.