development

Objective-C의 typedef 열거 형은 무엇입니까?

big-blog 2020. 9. 27. 13:04
반응형

Objective-C의 typedef 열거 형은 무엇입니까?


나는 무엇 enum이며 언제 사용 해야하는지 근본적으로 이해하지 못한다고 생각 합니다.

예를 들면 :

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

여기서 실제로 선언되는 것은 무엇입니까?


익명 열거 형식이 선언 : 세 가지가 여기에 선언되고있는 ShapeType익명 열거에 대한 형식 정의를 선언되고 있으며, 세 개의 이름은 kCircle, kRectanglekOblateSpheroid통합 상수로 선언되고있다.

그것을 분해합시다. 가장 간단한 경우 열거 형은 다음과 같이 선언 할 수 있습니다.

enum tagname { ... };

이것은 태그로 열거를 선언합니다 tagname. C와 오브젝티브 C (그러나에서 하지 C ++),이에 대한 참조가 있어야합니다 앞에는 enum키워드. 예를 들면 :

enum tagname x;  // declare x of type 'enum tagname'
tagname x;  // ERROR in C/Objective-C, OK in C++

enum모든 곳 에서 키워드 를 사용할 필요가 없도록 typedef를 만들 수 있습니다.

enum tagname { ... };
typedef enum tagname tagname;  // declare 'tagname' as a typedef for 'enum tagname'

이것은 한 줄로 단순화 할 수 있습니다.

typedef enum tagname { ... } tagname;  // declare both 'enum tagname' and 'tagname'

마지막으로 키워드 enum tagname와 함께 사용할 필요가 없다면 익명으로 만들고 typedef 이름으로 만 선언 할 수 있습니다.enumenum

typedef enum { ... } tagname;

이제이 경우 ShapeType에는 익명 열거 형의 typedef 이름을 선언 합니다. ShapeType정말 일체형이며, 단 (이며, 하나의 선언에 열거 된 값 중 하나를 보유 변수 선언 표기 kCircle, kRectangle등을 kOblateSpheroid). ShapeType하지만 캐스팅을 통해 변수에 다른 값을 할당 할 수 있으므로 열거 형 값을 읽을 때주의해야합니다.

마지막으로 kCircle, kRectanglekOblateSpheroid글로벌 네임 스페이스에 필수적인 상수로 선언된다. 특정 값이 지정되지 않았으므로 0부터 시작하는 연속 정수에 할당되므로 kCircle0, kRectangle1, kOblateSpheroid2입니다.


Apple은 Xcode 4.4부터 다음과 같이 열거 형을 정의 할 것을 권장합니다.

typedef enum ShapeType : NSUInteger {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

또한 편리한 매크로 NS_ENUM을 제공합니다.

typedef NS_ENUM(NSUInteger, ShapeType) {
    kCircle,
    kRectangle,
    kOblateSpheroid
};

이러한 정의는 더 강력한 유형 검사와 더 나은 코드 완성을 제공합니다. NS_ENUM의 공식 문서를 찾을 수 없지만 여기 에서 WWDC 2012 세션의 "Modern Objective-C"비디오를 볼 수 있습니다 .

업데이트 : 여기 에서 공식 문서 링크 .


열거 형은 정렬 된 값 집합을 선언합니다. typedef는 여기에 편리한 이름을 추가합니다. 첫 번째 요소는 0 등입니다.

typedef enum {
Monday=1,
...
} WORKDAYS;

WORKDAYS today = Monday;

위의 내용은 shapeType 태그의 열거 형입니다.


가능한 값이있는 사용자 정의 형 kCircle, kRectangle또는이 kOblateSpheroid. 하지만 열거 형 내부의 값 (kCircle 등)은 열거 형 외부에서 볼 수 있습니다. 이를 염두에 두는 것이 중요합니다 ( int i = kCircle;예 : 유효 함).


64 비트 변경에 대한 업데이트 : 64 비트 변경 에 대한 Apple 문서따르면

열거 형도 형식화 됨 : LLVM 컴파일러에서 열거 형은 열거 형의 크기를 정의 할 수 있습니다. 이는 일부 열거 된 유형이 예상보다 큰 크기를 가질 수도 있음을 의미합니다. 다른 모든 경우와 마찬가지로 솔루션은 데이터 유형의 크기에 대한 가정을하지 않는 것입니다. 대신 열거 된 값을 적절한 데이터 유형으로 변수에 할당하십시오.

So you have to create enum with type as below syntax if you support for 64-bit.

typedef NS_ENUM(NSUInteger, ShapeType) {
    kCircle,
    kRectangle,
    kOblateSpheroid
};

or

typedef enum ShapeType : NSUInteger {
   kCircle,
   kRectangle,
   kOblateSpheroid
} ShapeType;

Otherwise, it will lead to warning as Implicit conversion loses integer precision: NSUInteger (aka 'unsigned long') to ShapeType

Update for swift-programming:

In swift, there's an syntax change.

enum ControlButtonID: NSUInteger {
        case kCircle , kRectangle, kOblateSpheroid
    }

The enum (abbreviation of enumeration) is used to enumerate a set of values (enumerators). A value is an abstract thing represented by a symbol (a word). For example, a basic enum could be

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl };

This enum is called anonymous because you do not have a symbol to name it. But it is still perfectly correct. Just use it like this

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;

Ok. The life is beautiful and everything goes well. But one day you need to reuse this enum to define a new variable to store myGrandFatherPantSize, then you write:

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandFatherPantSize;

But then you have a compiler error "redefinition of enumerator". Actually, the problem is that the compiler is not sure that you first enum and you are second describe the same thing.

Then if you want to reuse the same set of enumerators (here xs...xxxxl) in several places you must tag it with a unique name. The second time you use this set you just have to use the tag. But don't forget that this tag does not replace the enum word but just the set of enumerators. Then take care to use enum as usual. Like this:

// Here the first use of my enum
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize; 
// here the second use of my enum. It works now!
enum sizes myGrandFatherPantSize;

you can use it in a parameter definition as well:

// Observe that here, I still use the enum
- (void) buyANewDressToMyGrandMother:(enum sizes)theSize;

You could say that rewriting enum everywhere is not convenient and makes the code looks a bit strange. You are right. A real type would be better.

This is the final step of our great progression to the summit. By just adding a typedef let's transform our enum in a real type. Oh the last thing, typedef is not allowed within your class. Then define your type just above. Do it like this:

// enum definition
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl };
typedef enum sizes size_type

@interface myClass {
   ...
   size_type myGrandMotherDressSize, myGrandFatherPantSize;
   ...
}

Remember that the tag is optional. Then since here, in that case, we do not tag the enumerators but just to define a new type. Then we don't really need it anymore.

// enum definition
typedef enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } size_type;

@interface myClass : NSObject {
  ...
  size_type myGrandMotherDressSize, myGrandFatherPantSize;
  ...
}
@end

If you are developing in Objective-C with XCode I let you discover some nice macros prefixed with NS_ENUM. That should help you to define good enums easily and moreover will help the static analyzer to do some interesting checks for you before to compile.

Good Enum!


typedef is useful for redefining the name of an existing variable type. It provides short & meaningful way to call a datatype. e.g:

typedef unsigned long int TWOWORDS;

here, the type unsigned long int is redefined to be of the type TWOWORDS. Thus, we can now declare variables of type unsigned long int by writing,

TWOWORDS var1, var2;

instead of

unsigned long int var1, var2;

typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;

then you can use it like :-

 ShapeType shape;

and

 enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} 
ShapeType;

now you can use it like:-

enum ShapeType shape;

enum is used to assign value to enum elements which cannot be done in struct. So everytime instead of accessing the complete variable we can do it by the value we assign to the variables in enum. By default it starts with 0 assignment but we can assign it any value and the next variable in enum will be assigned a value the previous value +1.


A typedef allows the programmer to define one Objective-C type as another. For example,

typedef int Counter; defines the type Counter to be equivalent to the int type. This drastically improves code readability.


The Typedef is a Keyword in C and C++. It is used to create new names for basic data types (char, int, float, double, struct & enum).

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

Here it creates enumerated data type ShapeType & we can write new names for enum type ShapeType as given below

ShapeType shape1; 
ShapeType shape2; 
ShapeType shape3;

You can use in the below format, Raw default value starting from 0, so

  • kCircle is 0,
  • kRectangle is 1,
  • kOblateSpheroid is 2.

You can assign your own specific start value.

typedef enum : NSUInteger {
    kCircle, // for your value; kCircle = 5, ...
    kRectangle,
    kOblateSpheroid
} ShapeType;

ShapeType circleShape = kCircle;
NSLog(@"%lu", (unsigned long) circleShape); // prints: 0

enum can reduce many types of "errors" and make the code more manageable

#define STATE_GOOD 0
#define STATE_BAD 1
#define STATE_OTHER 2
int STATE = STATE_OTHER

The definition has no constraints. It's simply just a substitution. It is not able to limit all conditions of the state. When the STATE is assigned to 5, the program will be wrong, because there is no matching state. But the compiler is not going to warn STATE = 5

So it is better to use like this

typedef enum SampleState {
    SampleStateGood  = 0,
    SampleStateBad,
    SampleStateOther
} SampleState;

SampleState state = SampleStateGood;

참고URL : https://stackoverflow.com/questions/707512/what-is-a-typedef-enum-in-objective-c

반응형