悩ましきコード整形
論理演算子のコード整形ってなんだか悩ましいですね。
まずは例を。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は死ね。