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

typ*_*ror 38 c struct objective-c default-value

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

CGRect ppGoalFrame;
LocalPlaySetup *localPlaySetup;
Run Code Online (Sandbox Code Playgroud)

我可以测试一下

if (localPlaySetup == nil)
Run Code Online (Sandbox Code Playgroud)

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

if (ppGoalFrame == nil)
Run Code Online (Sandbox Code Playgroud)

我明白了

invalid operands to binary == (have 'CGRect' and 'void *')
Run Code Online (Sandbox Code Playgroud)

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

And*_*rew 89

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

Apple确实提供了一个常数CGRectNull.您可以将变量设置为this并使用CGRectIsNull函数来确定它是否已设置. CGRectNull是不一样的CGRectZero,所以如果需要的值为零,你不用担心.

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

  • 结束使用CGRectIsEmpty进行测试.不必以任何方式设置它们.你的回答让我走上正轨,谢谢. (22认同)

gav*_*inb 45

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

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

if (CGRectIsEmpty(ppGoalFrame))
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)


小智 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. */
Run Code Online (Sandbox Code Playgroud)

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

CGRect newRect = CGRectNull;
Run Code Online (Sandbox Code Playgroud)