2012-01-10 3 views
0

私は2つの深いif文を持っていると私は、単一の場合のstmtに凝縮することができます場合、私は思ったんだけど場合:コーミング文

if ([[myScrollView.subviews objectAtIndex:k] isKindOfClass:[UILabel class]]) 
{ 
    if (((UILabel *)[myScrollView.subviews objectAtIndex:k]).tag >= i) 
    { 
     //code 
    } 
} 

私はにそれを作ることができるかどうかわからないんだけど

if ([[myScrollView.subviews objectAtIndex:k] isKindOfClass:[UILabel class]] && ((UILabel *)[myScrollView.subviews objectAtIndex:k]).tag >= i) 

2番目のif条件は最初の条件に依存しているため(UILabelではなく、.tag値がない場合)、悪いことが起こる可能性があります。

+0

上記のコメントは完全に正確です。あなたは一行でそれをやって何を得るのですか?あなたはそれをより効率的にするつもりはなく、今読むのは難しいです。真剣に言えば、コードの行数が少なくても、コードがより効率的になるわけではありません。 – Abizern

+0

ugh、私は読みやすさのために叩かれました。私の理論的根拠は、声明が2つを読むのが簡単ならば、私の根拠は1つだと思うが、私は2つの利点を見ることができる。私はstmtの場合、常にネストした嫌悪感を持っていました。私はコードの可読性を再評価して改良しようとします。 – Padin215

+0

この例で見落とされている問題は、 'subview'が' readonly'プロパティであるために冗長チェックを実行していることです。これは 'UIView'の配列を返します。 'UIView'は' tag'に応答しますので、最初にチェックする必要はありません。 –

答えて

6

あなたはそのように組み合わせることができます。最初のステートメントが失敗すると、ifステートメント全体が失敗し、2番目のステートメントは実行されません。

読みやすくするため、私はおそらく、このかかわらず、同じようにそれを記述します。

if ([[myScrollView.subviews objectAtIndex:k] isKindOfClass:[UILabel class]] && 
    ((UILabel *)[myScrollView.subviews objectAtIndex:k]).tag >= i) 
{ 
    // code 
} 
4

これは問題ありません。 C(拡張、Objective-C)& &式は「短絡」です。最初の句が偽と評価された場合、2番目の句は評価されません。

1

あなたはそれを第二の方法を行うことができます。基本的には、ANDステートメントでコンパイラは最初のステートメントをチェックし、それがfalseの場合は2番目のステートメントをチェックしません。したがって、2番目の/ innerステートメントは最初のステートメントが真である場合にのみ評価されます。

3

オペレータ&&は、false句に達した時点で評価を停止します。評価が副作用を引き起こさない限り、何ら問題はないはずです。

はしかし、改行や空白は、読みやすさのためにあなたの友人です:誰もが特定した

if ([[myScrollView.subviews objectAtIndex:k] isKindOfClass:[UILabel class]] 
    && ((UILabel *)[myScrollView.subviews objectAtIndex:k]).tag >= i) 
{ 
    //code 
} 
2

ように、これは可能ですが、読みやすさが主な問題です。提案中の空白の使用は

if ([[myScrollView.subviews objectAtIndex:k] isKindOfClass:[UILabel class]] 
&& ((UILabel *)[myScrollView.subviews objectAtIndex:k]).tag >= i) 
{ 
    //code 
} 

良いですが、私は個人的にはまだ私はそれらの文がそうしている、時にはそれは少しさらに

可読性を取る価値があるかもしれないものを理解するために、ダブルテイクをしなければならない見つけるだろう
UILabel *label  = [myScrollView.subviews objectAtIndex:k] 

BOOL isLabel  = [label isKindOfClass:[UILabel class]]; 
BOOL hasSuitableTag = label.tag >= i; 

if (isLabel && hasSuitableTag) { 
    //code 
} 

OR(あなたが持っていたでそれを展開する場合)(感謝@CocoaFu)

UILabel *label = [myScrollView.subviews objectAtIndex:k] 

BOOL isLabel = [label isKindOfClass:[UILabel class]]; 

if (isLabel && label.tag >= i) { 
    //code 
} 

結果はもっと英語のようなビットを読み込み、短絡を保つためにis a label and has a suitable tag。わずかに長くなるかもしれませんが、読んでから数週間後に追加の入力を感謝します。


プログラムが読んで人々のために書かれた、とだけ偶然に実行するマシンのためにする必要があります。

アベルソン&サスマン、Structure and Interpretation of Computer Programs

+0

サブビューkがラベルでない場合にクラッシュします(ここでは短絡していません) – mackworth

+0

サブビューの配列からオブジェクトを取得しています。すべての 'UIView'が' tag'に応答しました。これはかなり安全だと言いますか? 'subview'はreadonlyプロパティなので、' UIView'以外のものが含まれないように操作する方法はありません –

+1

@ Paul.s一般的に私は同意しますが、3行目は少し伸ばしていると思います遠くに短絡を緩める。私は 'hasSuitableTag'行を削除し、if:' if(isLabel && label.tag> = i) 'を作成します。明らかに、よく読んでいて短絡しています。 – zaph

関連する問題