web-dev-qa-db-ja.com

Objective-C構造体のデフォルト値とテスト方法

プロパティがまだ設定されているかどうかをテストしようとしています。私は私が持っているオブジェクトでそれを知っています:

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が近づくとすぐに少し迷ってしまいます。

38
typeoneerror

Nullにできるのはポインタのみです。 CGRectは構造体です-連続したメモリブロックを表します。内容をチェックするように設定されているかどうかを確認する唯一の方法です。

Appleは定数CGRectNullを提供しています。変数をこれに設定し、CGRectIsNull関数を使用して、設定されているかどうかを判断できます。 CGRectNullCGRectZeroと同じではないため、目的の値がゼロかどうかを心配する必要はありません。

CGRectNullには、Appleが後でCGRectIsNull関数で識別できる値が入力されたCGRect構造体が含まれているだけであることに注意してください。これは、ポインターを比較する場合と同じではありません。

89
Andrew

Objective-Cクラスのすべてのインスタンス変数はゼロに初期化されます。したがって、すべてのポインターはnil、数値は0、構造体はゼロになります。 CGRectはプレーンな構造体なので、Origin.x=0, Origin.y=0, size.width=0, size.height=0に初期化されます。

したがって、CGRectが設定されているかどうかをテストするには、それを(値で)ゼロと比較する必要があります。 CGRectIsEmpty関数はこれを正確に実行します。

if (CGRectIsEmpty(ppGoalFrame))
{
    // ...
}
45
gavinb

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;
5

CGRectをNSValueでラップすることもできます:

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

そして、nil値を避けます。

2
Carlos Ricardo

普遍的な「何もない」価値はありません。オブジェクトにはnilがあり、ポインタにはNULLがありますが、プレーンな値の型に相当するものはありません—たとえ意味がなくても、常にsome値を持っています。任意の値を取り、「これをこの型のnull値と呼ぶつもりです」(たとえば、#define IntNull 4444444そして、一部の計算が誤ってその値を返さないことを願っています)が、実際のnull値はありません。

特にCGRectの場合、Appleは「任意の値を選択する」戦術を使用し、CGRectNullを定義しましたが、CGRect変数はデフォルトではそれに設定されていません。デフォルトでは、CGRectインスタンス変数はCGRectZeroに設定されていますが、これは(0,0)の位置にある、幅0と高さ0の通常のCGRect構造体であることを忘れないでください。関数にはまったく予測できない値があります。

2
Chuck

実際には明らかでエレガントな解決策があります(笑):

SomeStruct someStruct = {0};

これは、構造体のすべての「要素」をゼロで埋めるだけです。

1
Nikita

CGRectとは であるC構造のバイナリ比較を行うことはできないと思います。 Googleをすばやく検索してC For Dummiesデスクリファレンスを確認しても、何も改善されませんでした。 CGRect ppGoalFrameを宣言し、構造体のメンバーを(まだ設定されていない場合は)デフォルト値で初期化し、構造体のメンバーをテストできます。

更新編集:これはC構造体の 質問されています です。

0
C.D. Reimer