我正在尝试测试是否已经设置了属性。我知道我拥有的物品:
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出现,我就会有点迷失。
只有指针可以为null。 CGRect是一个结构 - 它代表一个连续的内存块。判断是否已将其设置为检查其内容的唯一方法。
Apple确实提供了恒定的CGRectNull
。您可以将变量设置为this并使用CGRectIsNull函数来确定它是否已设置。 CGRectNull
与CGRectZero
不同,所以如果期望的值为零,您不必担心。
请注意,CGRectNull只包含一个CGRect结构,该结构填充了Apple稍后可以为CGRectIsNull函数标识的值。它与比较指针时的null不同。
Objective-C类中的所有实例变量都初始化为零。所以所有指针都是nil
,数字是0,结构是零。由于CGRect是一个普通的结构,它将初始化为origin.x=0, origin.y=0, size.width=0, size.height=0
。
因此,要测试您的CGRect
是否已设置,您需要将其(按值)与零进行比较。 CGRectIsEmpty
函数将完成以下操作:
if (CGRectIsEmpty(ppGoalFrame))
{
// ...
}
来自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;
没有普遍的“无”价值。对象有nil
,指针有NULL
,但普通值类型没有等价物 - 它们总是有一些价值,即使它只是无意义。您可以采用任意值并说“我将这称为此类型的空值”(例如,#define IntNull 4444444
并希望某些计算从不会意外地返回该值),但是没有真正的空值。
特别是在CGRect的情况下,Apple使用“选择一个任意值”的策略并定义了CGRectNull
,但是CGRect变量默认情况下没有设置 - 你必须自己专门设置它。默认情况下,CGRect实例变量设置为CGRectZero
,但请记住,这只是位置(0,0)的正常CGRect结构,其中0宽度和0高度。函数中的本地CGRect具有完全不可预测的值。
您也可以在NSValue中包装CGRect:
[NSValue valueWithCGRect:CGRectMake(x, y, width, height)]
然后避免nil
值。
我不认为你可以做一个C结构的二元比较,这是what CGRect is。快速的谷歌搜索和检查C For Dummies Desk Reference没有改变任何东西。您可以声明CGRect ppGoalFrame,使用默认值初始化结构成员(如果它们尚未存在),并测试结构成员。
更新编辑:这个question has been asked用于C结构。
实际上有一个明显而优雅的解决方案(笑):
SomeStruct someStruct = {0};
这只是用零填充结构的所有“元素”。