具有BOOL标志的应用程序状态

时间:2012-01-21 20:22:26

标签: objective-c c boolean state flags

我的应用程序中有5个状态,我使用BOOL标记来标记它们。但这并不简单,因为当我想改变状态时,我必须写5行来改变所有标志。

你能写一些想法或简单的代码来解决这个问题吗?

代码:

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

另外,这很糟糕,因为我可以一次选择2个状态。

P.S。 我找到了现代化的Apple风格。回答如下。

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

您始终可以使用其位来使用字节(unsigned char)大小变量 作为标志(每个位作为一个BOOL标志)。

设置/清除/切换/检查一下的好指令是here

当然,你想为此设置一些人类可读的名字 旗帜,即:

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

答案 2 :(得分:-1)

现在我们还有另一个标志选项。它是 NS_ENUM

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

第一个arg表示类型,第二个表示名称。