programing

열거형 값을 반복

abcjava 2023. 6. 20. 21:18
반응형

열거형 값을 반복

Objective-C에서 열거형 값을 루프할 수 있습니까?

정해진

enum Foo {Bar=0,Baz,...,Last};

다음과 같은 요소를 반복할 수 있습니다.

for(int i=Bar; i<=Last; i++) {
  ...
}

이렇게 하면 C 열거형의 진짜 본질이 노출됩니다.특히 열거형 값 대신 int를 사용할 수 있고 그 반대의 경우도 사용할 수 있기 때문에 C 열거형이 실제로 유형 안전을 제공하지 않는다는 것을 알 수 있습니다.또한, 이것은 열거값의 선언 순서에 따라 달라집니다. 적어도 취약합니다.또한 Chuck의 설명을 참조하십시오. 열거형 항목이 연속적이지 않은 경우(예: 일부 항목에 대해 명시적, 비순차적 값을 지정했기 때문에), 이는 전혀 작동하지 않습니다.좋아요.

열거형이 다음과 같이 정의된 경우:

enum Direction {  East,  West,  North,  South};

다음과 같은 방법으로 루프할 수 있습니다.

for ( int direction = East; direction <= South; ++direction)
{
   /* Do something with Direction
}

약간의 둔탁한 느낌이 듭니다. (전체 개념이 그렇듯)eh...) 그러나 이 작업을 여러 번 수행할 경우, 연속적이지 않은 열거형의 가능성을 처리하려면 (글로벌 상수) 배열을 생성하고 (엔누킬러의 예를 사용하여) 방향[4] = {동, 서, 북,South}; 그런 다음 루프에서 방향 자체에 대해 직접 반복하지 않고 방향[i]에 대해 말할 수 있습니다.

제가 말씀드렸듯이, 못생겼지만, 조금 덜 깨지기 쉬운 것 같아요...

비연속 열거형의 경우 다음을 수행하여 유효한 값을 반복할 수 있습니다.

enum {
    value_one   = 0,
    value_two   = 1,
    value_three = 3,
    value_max
}
for ( i = value_one; i < value_max; i++ )
{ 
    switch(i)
    {
        case value_one:
        case value_two:
        case value_three:
        case value_four:
        {
            /* ... Do something with valid enum value ... */
        }
        break;
        default:
            /* Found an invalid enum entry; ignore it */
        break;
    }
}

이것을 찾기 위해, 저는 제 자신의 요구를 충족시키는 다음과 같은 해결책을 만들었습니다.비슷한 걸 찾는 사람들을 위해 여기에 올려야겠다고 생각했습니다.

내가 열거형이 있다고 해요.

typedef NS_ENUM (NSInteger, ISDirection) {
  ISDirectionUp,
  ISDirectionDown,
  ISDirectionLeft,
  ISDirectionRight
};

루프오버가 가능하도록 다음과 같은 전처리기 매크로를 정의합니다.

#define ISDirectionAllAsDir ISDirection dir = ISDirectionUp; dir <= ISDirectionRight; dir++

그런 다음 루프 안에서 다음과 같이 사용합니다.

for(ISDirectionAllAsDir) {
  NSLog(@"Direction %d", dir);
}

이것은 반복하는 논리를 한 곳(매크로)에 배치하여 코드 유지보수성을 높입니다.

열거형의 이름 배열을 가져오고 배열의 길이를 사용하여 열거형의 길이(항목 수)를 확인할 수 있습니다.Enum의 GetNames 메서드를 사용합니다.Enum.GetNames(enumType)입니다.길이.

{
enum Pig { Snort, Sty, Oink, Curly };
const int Pig_Count = Enum.GetNames(typeof(Pig)).Length;
}

나는 여기서 얻은 것이 좋아 목표 C의 열거보다 반복?

typedef enum { ENUM1=0,  ENUM2, ENUM3, ENUM4 , TOTAL  } ;


for ( int i=ENUM1 ; i<TOTAL; i++)
{}

그렇게 하면 나중에 열거형을 계속 추가하고 루프에 영향을 미치지 않을 수 있습니까?

C++을 사용하고 있기 때문에 위의 내용이 적용되지 않는 경우 다음 사항을 수행해야 합니다.

enum Foo {
  One,
  Two,
  Three,
  Last
};

for ( int fooInt = One; fooInt != Last; fooInt++ )
{
   Foo foo = static_cast<Foo>(fooInt);
   // ...
}

저는 "마지막" 항목으로 제 열거를 더럽히는 것을 싫어합니다(그리고 그것은 사용되어서는 안 되며 항상 마지막으로 보관되어야 한다는 첨부된 메모). 그리고 마지막 열거 항목을 비밀 "마지막" 항목으로 사용하는 것 외에는 하나의 방법만 찾았습니다(마지막 열거 항목은 저를 메스껍게 만듭니다).

X 매크로를 사용하여 열거형을 정의하면 열거형의 항목 수를 쉽게 계산할 수 있습니다.이 접근 방식을 사용할 수 있는 시기에 대한 FMI 링크를 참조하십시오. 간략하게 설명하자면 다음과 같습니다.

#define COLOR_TABLE \
X(red, "red")       \
X(green, "green")   \
X(blue, "blue")

#define X(a, b) a,
enum COLOR {
  COLOR_TABLE
};
#undef X

#define X(a, b) b,
char *color_name[] = {
  COLOR_TABLE
};
#undef X

#define X(a, b) +1
int color_count = 0 COLOR_TABLE;
#undef X

언급URL : https://stackoverflow.com/questions/1662719/looping-through-enum-values

반응형