チャートビューを作成し、特定の X インデックスに対応する Y 値を要求できるデータソースを与えています。場合によっては、特定の X インデックスに Y 値がないことがあります。0 は完全に有効な Y 値である可能性があるため、この状況では nil を送信できません。価値がまったくないことを伝えるための目的Cの最良の方法は何ですか?
5 に答える
ある種のオブジェクトを使用してモデルとビューの間でデータを送信しているように見えます。おそらくNSNumber
、値を保持していて、メッセージを送信して値を取得しているのですが、オブジェクトがnil
、送信されたメッセージはを返し0
ます。
そのとおりです。この場合、オブジェクトがnil
であるかどうかを確認し、それに応じて続行します。
- (void)plotValue:(NSNumber *)number
{
if (number == nil) {
// no value
} else {
// Value may be 0, but you can now safely plot it.
}
}
nil
ありません0
。それらは違う。
を使用している場合NSNumber
、nil
は明らかに の集合から切り離されていNSNumber
ます。
を使用している場合はint
、使用できませんnil
。
データ ソースでプリミティブを使用しないでください。代わりに NSNumber を使用してください。次に、nil と値 0 を格納する NSNumber を区別できます。
NSNumber
オブジェクト ( )を使用したくない場合は、負の数(可能な場合) またはデータソースから返される可能性が低い最大/最小整数を返すことができます。
NSInteger などのスカラーについて話していると思います。Y 値に文字通り任意の整数が有効な場合、これを行う方法はありません。ただし、ほとんどの場合、実用的な範囲があるため、この範囲外の値を選択して「特別」にすることができます。たとえば、Cocoa には値NSNotFound
があり、配列にないオブジェクトのインデックスを要求すると NSArray が返します。これは、可能な最大の NSInteger として定義されます。Y 値が NSIntegerMax にならない場合は、これを自分で再利用できます。
このためだけに特別な型を作成したくないと仮定すると、他のオプションは、メソッドが Y と Y が実際に見つかったかどうかの両方を返すようにすることです。たとえば、いくつかの大まかな擬似コード:
- (NSInteger)yForX:(NSInteger)x wasFound:(BOOL *)found {
if (yWasFound) {
if (found)
*found = YES;
return y;
} else {
if (found)
*found = NO;
return 0;
}
}
一部の人が示唆しているように、NSNumber を使用することもできますが、nil を取得するためだけに NSNumbers を処理するのは少し面倒です。