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函数来确定是否已设置。 CGRectNullCGRectZero所以如果期望值为零,则不必担心。

请注意,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结构。

Interesting Posts