2011-07-12 13 views
14

別の開発者がプロ​​ジェクトに投稿した差分を見ていて、!!<some BOOL value>のコードがたくさんあります。実際、これはブールゲッターとセッターを実装するための標準的なパターンのようです。彼らは次のようなコードを実装しました:Objective-C - Is !! BOOL有益

- (BOOL) hasId { 
    return !!hasId_; 
} 
- (void) setHasId:(BOOL) value { 
    hasId_ = !!value; 
} 

これまで私はこのパターンを見たことがなく、それを使うことに何か利点があるのだろうかと思っています。二重否定は有用な何かをしていますか?

+0

これは、ブールにキャストするための簡単な方法ではないクラスのためだけだったので、 'if(myInstance)'は実行できませんでしたが、単項 '! '演算子がオーバーロードされました、彼らは 'if(!! myInstance)'を実行します。しかし、あなたの場合、私は考えていません。 – filipe

答えて

13

ダブルブール演算子は、単に返された値がすべてだ1または0のいずれかであることを確認します。)

+5

...これは 'obj.hasId = 42;のようなコードを防ぎます。 if(obj.hasId == YES) 'が条件に失敗するのを防ぎます。技術的には、「YES」は(現在)1にマッピングされているので、整数値は異なります。しかし概念的には、42と 'YES'の両方が真のブール値を表します。二重否定は、その割り当てを「YES」割り当てに崩壊させる。 –

+0

ありがとう、私はそれが多分それのようなものだと仮定しました。しかし、それをやり遂げることは有益でしょう/潜在的なエラーは避けられますか?同様に、これは 'if(obj.hasId == YES)'の形式で比較を行うときに予期しないエラーが発生するのを防ぐでしょうか?とにかく貧乏人のような比較はありませんが?編集:気にしないでください。 – aroth

+0

真実ですが、実際には、1や0に変換するのに役立つことがあります.SQLiteのようにブール値フィールドは1または0にしか保存されません。 –

3

!は論理否定演算子です。たとえば、0x2のようにsetHasId:が渡された場合、二重否定は0x1を格納します。

1

同等です:あなたがこれを行うためにあれば、いくつかの場合に便利です

hasId_ = value ? 1 : 0; 

BOOL x = y & MY_FLAG; 

結果がに切り捨てられますのでMY_FLAGが、設定されている場合は、0を得る可能性がありますBOOL(8ビット)のサイズ。これは予期せぬことです。同様の理由から、BOOLが0または1のどちらかであることを好む場合があります(ビット操作は期待どおりに機能します)。通常は不要です。

bool(C99の場合)やC++などの言語が組み込まれている言語では、整数をboolに自動的に変換します。

0

それはあなたがBOOLを返却する例えば他のいくつかの例では、より理にかなっているが、中にif文を入れたくない。この場合

- (BOOL)isMyVarSet 
{ 
    return !!myVar; 
} 

それはだから、私はちょうどmyVarを返すことはできません。 BOOLではありません(これは非常に工夫された例です - プロジェクトからまともなものを見つけられません)。私は前にこれを使用していると私は信じて

0

if (!!myVar)

は同等です:

if (myVar != nil)

基本的に、私は何かの値を確認するためにそれを使用します。

これはおそらく、この目標を達成するためのベストプラクティスまたは最も理解された方法ではありません。

+0

違いは:(myVar!= nil)はかなり明白ですが、(!! myVar)はあなたのトラックであなたを止め、あなたはそれが何をしているのかを考えなければなりません。それを書いた人が実際にそれを意味するかどうかを調べる。あなたが何を意味するのかを明確に表現するのに最適です。 – gnasher729

+0

完全に同意してください!私の答えは3歳ですが、今日はどんな新しいコードでも!varを書くことは絶対にありません! – mbm29414

関連する問題