2012-01-21 8 views
3

私のアプリケーションには5つのステートがあり、BOOLフラグを使用してそれらをマークします。しかし、私は状態を変更したいときにすべてのフラグを変更するために5行を書かなければならないので、単純ではありません。BOOLフラグ付きのアプリケーションステート

この問題を解決するためのアイデアや簡単なコードを書くことができますか?

コード:

//need to choose second state 
flag1 = false; 
flag2 = true; 
flag3 = false; 
flag4 = false; 
flag5 = false; 

私は2つのステート1時間を選択することができますので、また、それは悪いにあります。

P.S. 私は近代的でよりアップルの道を見つけました。以下に答えてください。

+0

現時点でこれを処理するコードを投稿できますか? –

+1

どれが相互に排他的かによって異なります。それらが本当に相互に排他的である場合、 'enum'は正しい選択です。 – Costique

+0

本当に。セットを使用することをお勧めします。 – kaspartus

答えて

14

使用typedef enum

注記これにより、最大64の異なる状態(ほとんどのプラットフォーム)が可能になります。より多くの状態が必要な場合は、このソリューションは機能しません。

このスキームを処理するには、ブール代数を完全に理解し、安全に処理する必要があります。

//define all possible states 
typedef enum 
{ 
    stateOne = 1 << 0,  // = 1 
    stateTwo = 1 << 1,  // = 2 
    stateThree = 1 << 2, // = 4 
    stateFour = 1 << 3, // = 8 
    stateFive = 1 << 4  // = 16 
} FiveStateMask; 

//declare a state 
FiveStateMask state; 

//select single state 
state = stateOne;   // = 1 

//select a mixture of two states 
state = stateTwo | stateFive;  // 16 | 2 = 18 

//add a state 
state |= stateOne;    // 18 | 1 = 19 

//remove stateTwo from our state (if set) 
if ((state & stateTwo) == stateTwo) 
{ 
    state ^= stateTwo;   // 19^2 = 17 
} 

//check for a single state (while others might also be selected) 
if ((state & stateOne) == stateOne) 
{ 
    //stateOne is selected, do something 
} 

//check for a combination of states (while others might also be selected) 
if ((state & (stateOne | stateTwo)) == stateOne | stateTwo) 
{ 
    //stateOne and stateTwo are selected, do something 
} 

//the previous check is a lot nicer to read when using a mask (again) 
FiveStateMask checkMask = stateOne | stateTwo; 
if ((state & checkMask) == checkMask) 
{ 
    //stateOne and stateTwo are selected, do something 
} 
+0

うわー、それは本当にいいです、私はCの本でそれを読んでいます。しかし、私は自分の知識をリフレッシュする必要があります。 "1 << 3"は00001 - > 01000を意味しますか? また、私は一度に2つの州を選ぶことができますが、安全ではありませんか?それとも、フラグを正しく使用しないと問題になります。 – kaspartus

+0

それは依存します。一度に1つの状態のみが可能であることを確認したい場合は、ビット単位のOR(|)は使用せず、単純な代入(=)のみを使用してください。 – Till

+0

1 << 3は左に3回シフトしたことを意味します。 – Till

1

バイト(符号なしの文字)サイズの変数は、そのビット ' をフラグとして使用できます(各ビットは1つのBOOLフラグとして機能します)。

ビットを設定/クリア/トグル/チェックするための良い指示はhereです。ビットマスクを使用して、すべての可能な状態を定義するための

Offcourseあなたはすなわち、この フラグの人間が読める名前の種類を設定したいと思います。:

#define flag1 1 
#define flag2 2 
#define flag3 4 
#define flag4 8 
#define flag5 16 
+1

このようなジョブにはdefineを使用することはお勧めできません。代わりにenumを使用してください。さらに、型の安全性を達成するためにtypedef列挙型を使用してください。 – Till

+0

trueですが、2^xの値(1,2,4,8,16 ...)を割り当てることを忘れないでください。簡単な列挙型は0,1,2,3を割り当てます... –

-1

最近では、フラグの別のオプションがあります。 NS_ENUMです。

typedef NS_ENUM(NSInteger, UITableViewCellStyle) { 
    UITableViewCellStyleDefault, 
    UITableViewCellStyleValue1, 
    UITableViewCellStyleValue2, 
    UITableViewCellStyleSubtitle 
}; 

最初の型はarg、名前は2番目です。

関連する問題