悩ましきコード整形
論理演算子のコード整形ってなんだか悩ましいですね。
まずは例を。UIViewのautoresizingMaskを設定するコード。いくつかの設定値の論理和を取ります。
view.autoresizingMask = ( UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight );
ここで、UIViewAutoresizingFlexibleHeightのみをコメントアウトしたいと思って、
view.autoresizingMask = (
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleWidth |
// UIViewAutoresizingFlexibleHeight
);
などと書くと、構文エラーでコンパイルが通らなくなります。UIViewAutoresizingFlexibleWidthの横に付いている、論理和演算子"|"の右辺がないためです。
同様に、以下のように行を昇降させた場合もコンパイルが通りません。
view.autoresizingMask = ( UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | );
一方、配列ではこんなことはありません。このような配列で、Sundayのみをコメントアウトしても全く問題ありません。
NSArray* dayNames = @[ @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", @"Sunday", ];
NSArray* dayNames = @[ @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", // @"Sunday", ];
(Objective-)Cに限らずともたいていの場合、配列の最終要素の後につけたコンマは無視されます。*1
そのため任意の要素(行)を手軽にコメントアウトしたり、順番を変えたりできるわけですが、これは非常に便利です。
もしも論理和計算でこれを実現しようと思うと、末尾要素にゼロを置く必要があります。以下のとおりですが、スマートとは思えません。
view.autoresizingMask = ( UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | 0);// 要素末尾にゼロを置く
知らない人が見たら「なんでこんなところにゼロがあるねん。。アホ?」って思うでしょうね。
同様に複数の条件をもつIF文で書くと、以下のようになります。「何がしたいんだ。。?アホ?」って突っ込まれることでしょう。
if ( cond0 || cond1 || cond2 || NO) { //... }
うーん、悩ましい。
*1:IE6, 7は死ね。