2012-01-21 2 views
3

내 응용 프로그램에는 5 개의 상태가 있으며 BOOL 플래그를 사용하여 표시합니다. 하지만 상태를 바꿀 때 모든 플래그를 변경하기 위해 5 줄을 써야하기 때문에 간단하지 않습니다.BOOL 플래그가있는 App States

이 문제를 해결하기위한 아이디어 나 간단한 코드를 작성할 수 있습니까?

코드 : 나는 2 주 한 시간을 선택할 수 있기 때문에

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

또한, 나쁜에 있습니다.

P. 나는 현대적이고 더 Apple-way를 발견했다. 아래 답변.

+0

지금 처리 할 코드를 게시 할 수 있습니까? –

+1

그들은 상호 배타적 인 정도에 따라 다릅니다. 모두 실제로 상호 배타적 인 경우,'enum '이 올바른 선택입니다. – Costique

+0

흠, 정말. 집합을 사용하는 것이 좋습니다. – kaspartus

답변

14

를 원하는 것입니다.

참고 이것은 최대 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

그게 달려 있습니다. 한 번에 하나의 상태 만 가능하도록하려면 비트 OR (|)을 사용하지 말고 단순한 할당 (=) 만 사용하십시오. – Till

+0

1 << 3은 왼쪽으로 세 번 이동 한 것을 의미합니다. = – Till

1

바이트 (부호없는 char) 크기 변수를 ' '비트를 사용하여 항상 사용할 수 있습니다 (각 비트는 하나의 BOOL 플래그로 작동 함).

비트를 설정/해제/전환/확인하는 좋은 지침은 here입니다.

Offcourse 당신은 비트 마스크를 사용하여 모든 가능한 상태를 정의하는 데 사용 typedef enum : 즉,이 플래그에 대한 사람이 읽을 수있는 이름의 종류를 설정하는

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

그런 작업에 대해서는 define을 사용하지 않는 것이 좋습니다. 대신 enum을 사용하십시오. 더 좋게는 typedef 열거 형을 사용하여 형식 안전을 확보하십시오. – Till

+0

사실이지만 2^x 값 (1,2,4,8,16 ...)을 지정하는 것을 잊지 말아야합니다. 간단한 열거 형은 0,1,2,3을 할당 할 것입니다 ... –

-1

요즘에는 플래그에 대한 또 다른 옵션이 있습니다. NS_ENUM입니다.

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

첫 번째 유형은 arg이고 이름은 두 번째 인수입니다.

관련 문제