Objective-C结构体的默认值以及如何testing
我试图testing一个属性是否已经设置。 我知道用我得到的物体:
CGRect ppGoalFrame; LocalPlaySetup *localPlaySetup;
我可以testing
if (localPlaySetup == nil)
但如果我试图用== nil或== NULL来testingCGRect
if (ppGoalFrame == nil)
我明白了
invalid operands to binary == (have 'CGRect' and 'void *')
那么CGRect
是否为“void”,null,nil …? 在它被设置之前? 显然,我不能比较CGrect到一个无效指针(我不能使用ppGoalFrame == void
); 还有另一种方法来testing这个? Objective-C到目前为止是相当容易理解,但只要C织机,我有点失落。
只有指针可以为空。 CGRect是一个结构 – 它代表了一个连续的内存块。 唯一的方法来判断是否已经设置了它的内容。
苹果确实提供了一个不变的CGRectNull
。 您可以设置您的variables,并使用CGRectIsNull函数来确定是否已设置。 CGRectNull
与CGRectZero
所以如果期望值为零,则不必担心。
请注意,CGRectNull只包含一个CGRect结构,其中填充了Apple可以稍后为CGRectIsNull函数标识的值。 它与比较指针时不一样。
Objective-C类中的所有实例variables都被初始化为零。 所以所有的指针都是nil
,数字是0,结构都归零。 由于CGRect是一个普通的结构,它将被初始化为origin.x=0, origin.y=0, size.width=0, size.height=0
。
因此,为了testing您的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;
没有普遍的“无”价值。 指针的对象和NULL
nil
,但是对于普通的值types没有等价的东西 – 它们总是有一定的价值,即使它只是无稽之谈。 你可以采取一个任意的值,并说“我打算把这个types的空值称为”(比如, #define IntNull 4444444
,希望有些计算不会意外返回那个值),但是没有真正的空值。
特别是在CGRect的情况下,Apple使用了“select一个任意值”的策略,并定义了CGRectNull
,但是CGRectvariables默认没有设置 – 你必须自己设置它。 默认情况下,CGRect实例variables被设置为CGRectZero
,但是请记住,这只是位置(0,0)处宽度为0,高度为0的普通CGRect结构。 一个函数中的本地CGRects具有完全不可预知的价值。
你也可以把CGRect换成NSValue:
[NSValue valueWithCGRect:CGRectMake(x, y, width, height)]
然后避免nil
值。
我不认为你可以做一个C结构的二进制比较,这是CGRect是什么 。 快速谷歌search和检查C傻瓜书桌参考没有任何东西了。 您可以声明CGRect ppGoalFrame,使用默认值(如果它们还没有)初始化结构的成员,然后testing结构成员。
更新编辑:这个问题已被要求 C结构。