열거형 값을 반복
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
'programing' 카테고리의 다른 글
범위의 행 수 결정 (0) | 2023.06.20 |
---|---|
null 값을 고유 값으로 카운트 (0) | 2023.06.20 |
판다 데이터 프레임 및 카운트에서 선택한 열에 있는 값의 고유한 조합 (0) | 2023.06.20 |
typescript node.js express 경로분리된 파일 모범 사례 (0) | 2023.06.20 |
django에서 openpyxl workbook 개체를 HttpResponse로 반환합니다.가능합니까? (0) | 2023.06.20 |