プロパティがまだ設定されているかどうかをテストしようとしています。私は私が持っているオブジェクトでそれを知っています:
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が近づくとすぐに少し迷ってしまいます。
Nullにできるのはポインタのみです。 CGRectは構造体です-連続したメモリブロックを表します。内容をチェックするように設定されているかどうかを確認する唯一の方法です。
Appleは定数CGRectNull
を提供しています。変数をこれに設定し、CGRectIsNull関数を使用して、設定されているかどうかを判断できます。 CGRectNull
はCGRectZero
と同じではないため、目的の値がゼロかどうかを心配する必要はありません。
CGRectNullには、Appleが後でCGRectIsNull関数で識別できる値が入力されたCGRect構造体が含まれているだけであることに注意してください。これは、ポインターを比較する場合と同じではありません。
Objective-Cクラスのすべてのインスタンス変数はゼロに初期化されます。したがって、すべてのポインターはnil
、数値は0、構造体はゼロになります。 CGRectはプレーンな構造体なので、Origin.x=0, Origin.y=0, size.width=0, size.height=0
に初期化されます。
したがって、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;
CGRectをNSValueでラップすることもできます:
[NSValue valueWithCGRect:CGRectMake(x, y, width, height)]
そして、nil
値を避けます。
普遍的な「何もない」価値はありません。オブジェクトにはnil
があり、ポインタにはNULL
がありますが、プレーンな値の型に相当するものはありません—たとえ意味がなくても、常にsome値を持っています。任意の値を取り、「これをこの型のnull値と呼ぶつもりです」(たとえば、#define IntNull 4444444
そして、一部の計算が誤ってその値を返さないことを願っています)が、実際のnull値はありません。
特にCGRectの場合、Appleは「任意の値を選択する」戦術を使用し、CGRectNull
を定義しましたが、CGRect変数はデフォルトではそれに設定されていません。デフォルトでは、CGRectインスタンス変数はCGRectZero
に設定されていますが、これは(0,0)の位置にある、幅0と高さ0の通常のCGRect構造体であることを忘れないでください。関数にはまったく予測できない値があります。
実際には明らかでエレガントな解決策があります(笑):
SomeStruct someStruct = {0};
これは、構造体のすべての「要素」をゼロで埋めるだけです。