我的应用程序中有5个状态,我使用BOOL标记来标记它们。但这并不简单,因为当我想改变状态时,我必须写5行来改变所有标志。
你能写一些想法或简单的代码来解决这个问题吗?
代码:
//need to choose second state
flag1 = false;
flag2 = true;
flag3 = false;
flag4 = false;
flag5 = false;
另外,这很糟糕,因为我可以一次选择2个状态。
P.S。 我找到了现代化的Apple风格。回答如下。
答案 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表示类型,第二个表示名称。