2012-04-04 13 views
0

私は位置としてゼロをチェックし、NSIntegerをメソッドのオプションのパラメータにすることはできますか?

setData:(SomeClassName *)data inPosition:(NSInteger)position 

と実施中の線に沿っての方法を持っていると思います。アイデアは、ポジションが提供されている場合、私はそれを使用し、そうでない場合、私はそれを自動的に割り当てます。

問題は、コンパイラの警告なしでNULLまたはnilを渡すことができないことです。

私はこのパターンを他の場所で見たと思います(オプションのパラメータ)。私はそれがNSIndexPathに関連している可能性があると思います。

NSNumberをラッパーとして使用する必要がありますか?または他の秘密がありますか?

私は別として、setData:とsetData:inPosition:という別のメソッドを使用することを検討しました。しかし、問題は、 'データ'は、データが属性であり、通常のivarではなく、実際には値を設定したいときには、すべてのKVOメッセージを送信することを忘れてしまいます。例えば、setData:withPositionの中では、標準のsetDataを呼び出すことはできません: - 私がその位置で行った作業を上書きします。

また、これらの2つの「より良い」解決方法を知ることにも興味があります。

+0

NSNumberまたはoverloadを使用 – mshsayem

+1

Objective-Cに過負荷はありません。 –

答えて

3

@ジャスティンのアプローチが一般に最も適切です。しかし、setData:とKVOに関するご質問には、いくつかのことを注意することがあります。

  • KVO通知は限りメソッドはsetFoo:という名前のように自動的に送信されます。 setFoo:を上書きした場合でも、KVOはそのプロパティの正しいKVO通知呼び出しで実装をラップします。これはココアで最も魔法のようなものです。 (私はそれが最も魔法のようなものだったと確かに分かっていましたが、ブロック変数スコープ、特にブロックがスタックからヒープにどのように移動するのか不思議に思っています;それはより魔法かもしれません);

  • コアデータ属性を直接設定する必要がある場合、KVOやその他の可能な魔法を回避するには、プリミティブアクセサを使用できます。 setPrimitiveData:は、setData:がプロパティの設定に使用する基本的な方法です。プリミティブアクセサをオーバーライドしないでください。


@Justinは彼の答えを削除しているように見えます。ここの典型的な解決策は、setData:setData:inPosition:を宣言することです(btw、読者としては、 "inPosition"の意味を理解していません)。 setData:は、 "位置を把握するために必要なものを適用してsetData:inPosition:を呼び出すでしょう。「

+0

うわー、それは魔法です。誰が知っていた(まあ、あなたがやった)。 はい、KVOについて言及したとき、私はsetPrimitiveData:メソッドも含めることを意味しました。 したがって、私はデフォルトのsetDataをカスタマイズします:位置を把握し、それをsetData:inPositionに送ります。しかし、setData:inPositionの中で、実際には、データを設定する必要があります。これをsetDataを使って行うと、「位置」を再計算してsetData:inPosition:に返します。これはsetDataを使用します。 または、私は標準のsetDataを使用すべきではないと言っていますか?実際にデータを設定し、代わりにsetPrimitveData:を使用します。 –

+1

正しい。ここでの1つのトリックは、KVOに 'setData:inPosition:'から投稿させるかどうかです。もしそうなら、自分で投稿し、 'setData:'からそれを抑制する必要があります。 '+ automaticallyNotifiesObserversForKey:'をオーバーライドし、 'data'にNOを返します。 –

+0

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/doc/uid/20002178-BAJEAIEE –

1

NSNumberラッパーの使用はかなり標準的です。

もちろん、-1、NSNotFoundを渡すことも、独自のn/a値を定義することもできます。

0

の3つのオプションがありますため

  1. 峠-1またはそのようないくつかの "無価値
  2. ""
  3. がするNSNumberラッパーを使用してのためnilを渡す" 値なし過負荷

Objective-Cのオプションのパラメータメカニズムを使用しようとする可能性がありますが、リストの末尾に何らかのセンチネルが必要なので、他のものより優れていません。

関連する問題