ここでの初心者の質問:
値の範囲、特にタグに関係するIfステートメントを作成している場合、論理ORを使用する以外に、それを行う簡単な方法はありますか?
if (tableView.tag == 1 || tableView.tag==2 || tableView.tag==3) { do something}
これはあまり効率的に見えません。
ここでの初心者の質問:
値の範囲、特にタグに関係するIfステートメントを作成している場合、論理ORを使用する以外に、それを行う簡単な方法はありますか?
if (tableView.tag == 1 || tableView.tag==2 || tableView.tag==3) { do something}
これはあまり効率的に見えません。
if (tableView.tag >= minRange && tableView.tag <= maxRange)
{
}
「より簡単」の定義に依存します...比較の数が少ない場合、効率は実際には考慮されません。>=
個々の値をテストするか、値が連続している場合はテストを実行できます<=
。必要に応じて、いつでもマクロまたはインライン関数を使用して整理できます。たとえば、次のようになります。
NS_INLINE BOOL inRange(lower, value, upper) { return (lower <= value) && (value <= upper); }
多数のテスト、または単に美学の場合、他の方法にはビットマスクと配列の使用が含まれます。
32 または 64 までの少数の連続する値をテストする場合は、テスト対象のセットのビットマスクを定義して、ビットごとの演算を行うことができます。例えば:
typedef enum { Sunday = 0, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } Day;
int WeekendSet = (1 << Sunday | 1 << Saturday);
if ( (1 << day) & WeekendSet ) // day is a weekend
より大きくても大きすぎないセットの場合は、配列を使用できます。isletter()
これは、標準ライブラリisdigit()
などの関数が時々定義される方法です。1 バイト文字はせいぜい 255 であるため、256 要素のブール値の静的配列を宣言することは非常にうまく機能します。例えば
static uint8 isADigit[] = { 0, 0, ..., 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, ... }; // 256 values, only 10 1's for position's '0' through '9'
if ( isADigit[myChar] ) // myChar is a digit
switch
テストしている値が整数型の場合は、フォールスルーで使用できます。
switch(tableView.tag) {
case 1:
case 2:
case 3:
// do something
break;
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
// do something else
break;
}