代码之家  ›  专栏  ›  技术社区  ›  typeoneerror

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

  •  38
  • typeoneerror  · 技术社区  · 15 年前

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

    CGRect ppGoalFrame;
    LocalPlaySetup *localPlaySetup;
    

    我可以测试

    if (localPlaySetup == nil)
    

    但是如果我尝试用==nil或==null来测试cgrect

    if (ppGoalFrame == nil)
    

    我得到

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

    这也是 CGRect “无效”,无效,零…?在设置之前?显然,我不能将cgrect与空指针进行比较(我不能使用 ppGoalFrame == void )有没有其他方法来测试这个?目标C到目前为止是很容易理解的,但一旦C逼近,我会有点迷路。

    6 回复  |  直到 10 年前
        1
  •  88
  •   DBD    12 年前

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

    苹果确实提供了一个常量 CGRectNull . 您可以将变量设置为this,并使用cgritsnall函数确定是否已设置该变量。 CgPrimNULL 与…不同 CGRectZero 因此,如果所需值为零,则无需担心。

    注意,cgritnull只包含一个cgritt结构,该结构中填充了苹果稍后可以为cgritsnall函数标识的值。它与比较指针时的空值不同。

        2
  •  45
  •   gavinb    12 年前

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

    所以要测试 CGRect 已设置,您需要将其(按值)与零进行比较。这个 CGRectIsEmpty 函数将执行以下操作:

    if (CGRectIsEmpty(ppGoalFrame))
    {
        // ...
    }
    
        3
  •  5
  •   typeoneerror    12 年前

    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;
    
        4
  •  2
  •   Chuck    15 年前

    没有普遍的“无”价值。有 nil 对象和 NULL 对于指针,但对于普通值类型“无等价物”,它们总是有 一些 价值,即使只是胡说八道。你可以取一个任意的值,然后说“我要把它称为这种类型的空值”(比如, #define IntNull 4444444 希望某些计算不会意外返回该值),但没有真正的空值。

    特别是在cgrect的情况下,苹果使用了“选择任意值”策略并定义了 CGRectNull 但是cDirect变量没有设置为默认值,你必须自己设置。默认情况下,CGRECT实例变量设置为 CGRectZero ,但请记住,这只是一个普通的cgrect结构,位于0,0位置,宽度为0,高度为0。函数中的局部CGRECT有一个完全不可预测的值。

        5
  •  2
  •   Carlos Ricardo    12 年前

    也可以在nsvalue中包装cgrect:

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

    然后避免 nil 价值。

        6
  •  0
  •   Community CDub    8 年前

    我认为你不能对C结构做二元比较,那就是 what CGRect is . 一个快速的谷歌搜索和检查C的虚拟桌面参考没有发现任何东西。您可以声明cgrect ppgoalframe,用默认值初始化结构的成员(如果还没有),然后测试结构成员。

    更新编辑:此 question has been asked 对于C结构。