source

objective-c typedef를 해당하는 문자열로 변환합니다.

gigabyte 2022. 8. 29. 22:14
반응형

objective-c typedef를 해당하는 문자열로 변환합니다.

.h 파일에서 typedef가 선언되어 있는 경우:

typedef enum {
  JSON,
  XML,
  Atom,
  RSS
} FormatType;

string.typedef로 .를 들어, " " " " " 가 " 입니다.[self toString:JSON]전송되었습니다. 'JSON'이 반환됩니다.

함수는 다음과 같습니다.

-(NSString *) toString:(FormatType)formatType {
  //need help here
  return [];
}

덧붙여서, 이 구문을 사용해 보면

[self toString:FormatType.JSON];

typedef 값을 메서드에 전달하면 오류가 발생합니다.제가 무엇을 빠뜨리고 있나요?

이것은 실제로 C에 관한 질문이며, Objective-C(C 언어의 슈퍼셋)에 한정되지 않습니다.C 은 Enum 。따라서 열거값이 지정된 문자열을 반환하는 함수를 작성해야 합니다.이렇게 하는 방법은 여러 가지가 있습니다. 맵할 수 : " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "NSDictionary및어프로치, 명확하지 .C0과 합니다.enum 0) enum way way 가 。하다

- (NSString*)formatTypeToString:(FormatType)formatType {
    NSString *result = nil;

    switch(formatType) {
        case JSON:
            result = @"JSON";
            break;
        case XML:
            result = @"XML";
            break;
        case Atom:
            result = @"Atom";
            break;
        case RSS:
            result = @"RSS";
            break;
        default:
            [NSException raise:NSGenericException format:@"Unexpected FormatType."];
    }

    return result;
}

: enum " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "JSON이.FormatType.JSONsytax.FormatType 및 는유 JSON,XML 은, 할 수 값입니다.

당신은 그것을 쉽게 할 수 없어요.C와 Objective-C에서 Enum은 실제로는 단지 미화된 정수 상수입니다.사용자가 직접 이름 테이블을 생성해야 합니다(또는 프로세서의 오용도 있음).예를 들어 다음과 같습니다.

// In a header file
typedef enum FormatType {
    JSON,
    XML,
    Atom,
    RSS
} FormatType;

extern NSString * const FormatType_toString[];

// In a source file
// initialize arrays with explicit indices to make sure 
// the string match the enums properly
NSString * const FormatType_toString[] = {
    [JSON] = @"JSON",
    [XML] = @"XML",
    [Atom] = @"Atom",
    [RSS] = @"RSS"
};
...
// To convert enum to string:
NSString *str = FormatType_toString[theEnumValue];

이 접근법의 위험은 열거형을 변경할 경우 이름 배열을 변경해야 한다는 것입니다.프리프로세서의 오용에 의해서 이 문제를 해결할 수 있지만, 그것은 까다롭고 추악합니다.

또한 유효한 열거 상수가 있다고 가정합니다.할 수 없는 소스로부터의 , 시키거나 배열 길이보다 .sizeof(FormatType_toString) / sizeof(FormatType_toString[0]).

저는 이 문제를 해결하기 위해 가장 우아한 접근법을 고안했다고 생각합니다.(@Adam Rosenfield에서 영감을 얻음)

예를 들어 다음과 같이 열거를 선언할 수 있습니다.

typedef NS_ENUM(int, MyEnum) {
    MyEnumDefault,
    MyEnumOff,
    MyEnumOn,
    MyEnumMixed,
};

static NSString * const __SGEnumMap_MyEnum[] = {
    [MyEnumDefault] = @"default",
    [MyEnumOff] = @"off",
    [MyEnumOn] = @"on",
    [MyEnumMixed] = @"mixed"
};
    
SGENUM_DEFINE_ToString(MyEnum)
SGENUM_DEFINE_FromString(MyEnum)

다음으로 enum과 string을 변환하는2가지 함수를 가져옵니다.

NSString *result = MyEnumToString(MyEnumOn); 
NSLog(@"%@", result);
// on
    
MyEnum value = MyEnumFromString(@"off", -1); // -1 as the default value
NSLog(@"%d", result);
// 1

저거 멋있어?매직 매크로는 다음과 같습니다.

#define SGENUM_DEFINE_ToString(name) NS_INLINE NSString *name##ToString(name value){\
    int count = sizeof(__SGEnumMap_##name) / sizeof(NSString *);\
    if (value > count || value < 0) return nil;\
    return __SGEnumMap_##name[value];\
}

#define SGENUM_DEFINE_FromString(name) NS_INLINE name name##FromString(NSString *input, int defaultValue) {\
    int count = sizeof(__SGEnumMap_##name) / sizeof(NSString *);\
    for (int i = 0; i < count; i++) {\
        NSString *str = __SGEnumMap_##name[i];\
        if ([str isEqual:input]) {\
            return i;\
        }\
    }\
    return defaultValue;\
}

또 다른 솔루션:

typedef enum BollettinoMavRavTypes {
    AMZCartServiceOperationCreate,
    AMZCartServiceOperationAdd,
    AMZCartServiceOperationGet,
    AMZCartServiceOperationModify
} AMZCartServiceOperation;

#define AMZCartServiceOperationValue(operation) [[[NSArray alloc] initWithObjects: @"CartCreate", @"CartAdd", @"CartGet", @"CartModify", nil] objectAtIndex: operation];

사용 방법에서는 다음을 사용할 수 있습니다.

NSString *operationCheck = AMZCartServiceOperationValue(operation);

다음과 같은 열거 정의가 지정됩니다.

typedef NS_ENUM(NSInteger, AssetIdentifier) {
    Isabella,
    William,
    Olivia
};

다음과 같이 열거값을 대응하는 문자열로 변환하는 매크로를 정의할 수 있습니다.

#define AssetIdentifier(asset) \
^(AssetIdentifier identifier) { \
switch (identifier) { \
case asset: \
default: \
return @#asset; \
} \
}(asset)

switch블록에서 사용되는 문은 유형 확인 및 Xcode의 자동 완성 지원을 받기 위한 것입니다.

여기에 이미지 설명 입력 여기에 이미지 설명 입력

: ★★★★★★★★★★★★★★★*



1.
배열에 이름을 키로 입력합니다.
인덱스가 적절한 enum인지 확인하고 올바른 순서(그렇지 않은 경우 예외)인지 확인하십시오.
주의: names는 *_names*로 합성된 속성입니다.

컴파일을 위해 코드가 체크되지 않았지만, 나는 내 앱에서 같은 기술을 사용했다.

typedef enum {
  JSON,
  XML,
  Atom,
  RSS
} FormatType;

+ (NSArray *)names
{
    static NSMutableArray * _names = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _names = [NSMutableArray arrayWithCapacity:4];
        [_names insertObject:@"JSON" atIndex:JSON];
        [_names insertObject:@"XML" atIndex:XML];
        [_names insertObject:@"Atom" atIndex:Atom];
        [_names insertObject:@"RSS" atIndex:RSS];
    });

    return _names;
}

+ (NSString *)nameForType:(FormatType)type
{
    return [[self names] objectAtIndex:type];
}


//

2.
Modern Obj-C를 사용하면 사전을 사용하여 설명을 열거형 키에 연결할 수 있습니다.
순서는 중요하지 않습니다.

typedef NS_ENUM(NSUInteger, UserType) {
    UserTypeParent = 0,
    UserTypeStudent = 1,
    UserTypeTutor = 2,
    UserTypeUnknown = NSUIntegerMax
};  

@property (nonatomic) UserType type;

+ (NSDictionary *)typeDisplayNames
{
    return @{@(UserTypeParent) : @"Parent",
             @(UserTypeStudent) : @"Student",
             @(UserTypeTutor) : @"Tutor",
             @(UserTypeUnknown) : @"Unknown"};
}

- (NSString *)typeDisplayName
{
    return [[self class] typeDisplayNames][@(self.type)];
}


( 클클클클클클클클클:: 。

NSLog(@"%@", [self typeDisplayName]);


@AdamRosenfield 답변, @Christoph 코멘트 및 플레인 C enum을 처리하기 위한 다른 요령을 조합하여 제안합니다.

// In a header file
typedef enum {
  JSON = 0,         // explicitly indicate starting index
  XML,
  Atom,
  RSS,

  FormatTypeCount,  // keep track of the enum size automatically
} FormatType;
extern NSString *const FormatTypeName[FormatTypeCount];


// In a source file
NSString *const FormatTypeName[FormatTypeCount] = {
  [JSON] = @"JSON",
  [XML] = @"XML",
  [Atom] = @"Atom",
  [RSS] = @"RSS",
};


// Usage
NSLog(@"%@", FormatTypeName[XML]);

예를 들어 열거형을 변경했지만 이름 배열 변경을 잊은 경우처럼 최악의 경우 이 키에 대해 0이 반환됩니다.

이 페이지에서 찾을 수 있는 모든 솔루션을 혼합하여 내 솔루션을 만들었습니다. 객체 지향 열거형 확장자 같은 것입니다.

사실 상수(정수) 이상의 것이 필요한 경우 모델 객체가 필요할 수 있습니다(모두 MVC에 대해 이야기하고 있습니다).

이 기능을 사용하기 전에 자문해 보십시오.실제 모델 오브젝트는 웹 서비스, 목록, SQLite 데이터베이스 또는 CoreData에서 초기화해야 하지 않습니까?

어쨌든, 코드는 다음과 같습니다(MPI는 「My Project Initials」의 경우, 모두 이것 또는 자신의 이름을 사용하고 있는 것 같습니다).

MyWonderfulType.h:

typedef NS_ENUM(NSUInteger, MPIMyWonderfulType) {
    MPIMyWonderfulTypeOne = 1,
    MPIMyWonderfulTypeTwo = 2,
    MPIMyWonderfulTypeGreen = 3,
    MPIMyWonderfulTypeYellow = 4,
    MPIMyWonderfulTypePumpkin = 5
};

#import <Foundation/Foundation.h>

@interface MyWonderfulType : NSObject

+ (NSString *)displayNameForWonderfulType:(MPIMyWonderfulType)wonderfulType;
+ (NSString *)urlForWonderfulType:(MPIMyWonderfulType)wonderfulType;

@end

★★★★★★★★★★★★★★★★★.MyWonderfulType.m:

#import "MyWonderfulType.h"

@implementation MyWonderfulType

+ (NSDictionary *)myWonderfulTypeTitles
{
    return @{
             @(MPIMyWonderfulTypeOne) : @"One",
             @(MPIMyWonderfulTypeTwo) : @"Two",
             @(MPIMyWonderfulTypeGreen) : @"Green",
             @(MPIMyWonderfulTypeYellow) : @"Yellow",
             @(MPIMyWonderfulTypePumpkin) : @"Pumpkin"
             };
}

+ (NSDictionary *)myWonderfulTypeURLs
{
    return @{
             @(MPIMyWonderfulTypeOne) : @"http://www.theone.com",
             @(MPIMyWonderfulTypeTwo) : @"http://www.thetwo.com",
             @(MPIMyWonderfulTypeGreen) : @"http://www.thegreen.com",
             @(MPIMyWonderfulTypeYellow) : @"http://www.theyellow.com",
             @(MPIMyWonderfulTypePumpkin) : @"http://www.thepumpkin.com"
             };
}

+ (NSString *)displayNameForWonderfulType:(MPIMyWonderfulType)wonderfulType {
    return [MPIMyWonderfulType myWonderfulTypeTitles][@(wonderfulType)];
}

+ (NSString *)urlForWonderfulType:(MPIMyWonderfulType)wonderfulType {
    return [MPIMyWonderfulType myWonderfulTypeURLs][@(wonderfulType)];
}


@end

여기서의 모든 답변은 기본적으로 같은 것을 말합니다.정규 열거형을 작성한 후 커스텀게터를 사용하여 문자열 사이를 전환합니다.

저는 매크로를 사용하여 빠르고, 짧고, 깔끔한 솔루션을 채택하고 있습니다.


#define kNames_allNames ((NSArray <NSString *> *)@[@"Alice", @"Bob", @"Eve"])
#define kNames_alice ((NSString *)kNames_allNames[0])
#define kNames_bob ((NSString *)kNames_allNames[1])
#define kNames_eve ((NSString *)kNames_allNames[2])

'하다'라고 하면 .kNam...됩니다.

또한 모든 이름의 로직을 한 번에 처리하려면 다음과 같이 리터럴 배열을 순서대로 빠르게 열거할 수 있습니다.

for (NSString *kName in kNames_allNames) {}

마지막으로 매크로의 NSString 캐스팅은 typedef와 유사한 동작을 보장합니다.


맛있게 드세요!

여기에서는 몇 가지 접근방식을 조합했습니다.프리프로세서와 인덱스 리스트의 아이디어가 마음에 듭니다.

추가적인 동적 할당은 없으며, 인라인 덕분에 컴파일러는 검색을 최적화할 수 있습니다.

typedef NS_ENUM(NSUInteger, FormatType) { FormatTypeJSON = 0, FormatTypeXML, FormatTypeAtom, FormatTypeRSS, FormatTypeCount };

NS_INLINE NSString *FormatTypeToString(FormatType t) {
  if (t >= FormatTypeCount)
    return nil;

#define FormatTypeMapping(value) [value] = @#value

  NSString *table[FormatTypeCount] = {FormatTypeMapping(FormatTypeJSON),
                                      FormatTypeMapping(FormatTypeXML),
                                      FormatTypeMapping(FormatTypeAtom),
                                      FormatTypeMapping(FormatTypeRSS)};

#undef FormatTypeMapping

  return table[t];
}

문자열 종속성을 삭제하여 @yar1vn 응답 향상:

#define VariableName(arg) (@""#arg)

typedef NS_ENUM(NSUInteger, UserType) {
    UserTypeParent = 0,
    UserTypeStudent = 1,
    UserTypeTutor = 2,
    UserTypeUnknown = NSUIntegerMax
};  

@property (nonatomic) UserType type;

+ (NSDictionary *)typeDisplayNames
{
    return @{@(UserTypeParent) : VariableName(UserTypeParent),
             @(UserTypeStudent) : VariableName(UserTypeStudent),
             @(UserTypeTutor) : VariableName(UserTypeTutor),
             @(UserTypeUnknown) : VariableName(UserTypeUnknown)};
}

- (NSString *)typeDisplayName
{
    return [[self class] typeDisplayNames][@(self.type)];
}

따라서 enum 항목 이름을 변경하는 경우 해당 문자열이 변경됩니다.이 문자열을 사용자에게 표시하지 않을 경우 유용합니다.

@http://https://stackoverflow.com/a/24255387/1364257 에 가장 훌륭한 답변을 추가했습니다.그에게 투표해 주세요!

그는 1960년대의 깔끔한 X 매크로를 사용한다(현대 ObjC를 위해 코드를 조금 바꿨다).

#define X(a, b, c) a b,
enum ZZObjectType {
    XXOBJECTTYPE_TABLE
};
typedef NSUInteger TPObjectType;
#undef X

#define XXOBJECTTYPE_TABLE \
X(ZZObjectTypeZero, = 0, @"ZZObjectTypeZero") \
X(ZZObjectTypeOne, , @"ZZObjectTypeOne") \
X(ZZObjectTypeTwo, , @"ZZObjectTypeTwo") \
X(ZZObjectTypeThree, , @"ZZObjectTypeThree")

+ (NSString*)nameForObjectType:(ZZObjectType)objectType {
#define X(a, b, c) @(a):c, 
    NSDictionary *dict = @{XXOBJECTTYPE_TABLE};
#undef X
    return dict[objectType];
}

바로 그겁니다.깔끔하고 깔끔하다.@pixel 덕분에!https://stackoverflow.com/users/21804/pixel

클래스 헤더에 typedef enum을 정의합니다.

typedef enum {
    IngredientType_text  = 0,
    IngredientType_audio = 1,
    IngredientType_video = 2,
    IngredientType_image = 3
} IngredientType;

수업 시간에 다음과 같은 방법을 씁니다.

+ (NSString*)typeStringForType:(IngredientType)_type {
   NSString *key = [NSString stringWithFormat:@"IngredientType_%i", _type];
   return NSLocalizedString(key, nil);
}

Localizable.strings 파일 에 문자열이 있습니다.

/* IngredientType_text */
"IngredientType_0" = "Text";
/* IngredientType_audio */
"IngredientType_1" = "Audio";
/* IngredientType_video */
"IngredientType_2" = "Video";
/* IngredientType_image */
"IngredientType_3" = "Image";

컴파일러의 #문자열 토큰(모든 것을 보다 콤팩트하게 하기 위해 매크로와 함께)을 사용합니다.

#define ENUM_START              \
            NSString* ret;      \
            switch(value) {

#define ENUM_CASE(evalue)       \
            case evalue:        \
                ret = @#evalue; \
                break;

#define ENUM_END                \
            }                   \
            return ret;

NSString*
_CvtCBCentralManagerStateToString(CBCentralManagerState value)
{
    ENUM_START
        ENUM_CASE(CBCentralManagerStateUnknown)
        ENUM_CASE(CBCentralManagerStateResetting)
        ENUM_CASE(CBCentralManagerStateUnsupported)
        ENUM_CASE(CBCentralManagerStateUnauthorized)
        ENUM_CASE(CBCentralManagerStatePoweredOff)
        ENUM_CASE(CBCentralManagerStatePoweredOn)
    ENUM_END
}

는 음에들이 에 들어요.#define★★★★

// 이것을 @interface 블록 외부에 있는 .h 파일에 저장합니다.

typedef enum {
    JPG,
    PNG,
    GIF,
    PVR
} kImageType;
#define kImageTypeArray @"JPEG", @"PNG", @"GIF", @"PowerVR", nil

// Place this in the .m file, inside the @implementation block
// A method to convert an enum to string
-(NSString*) imageTypeEnumToString:(kImageType)enumVal
{
    NSArray *imageTypeArray = [[NSArray alloc] initWithObjects:kImageTypeArray];
    return [imageTypeArray objectAtIndex:enumVal];
}

source(소스를 사용할 수 없게 되었습니다)

i i i i i i i i i i i i i i it it it it로 변환하고 .NSDictionary찾다.나는 결국 그것을 이용하게 되었다.sedOSX os os음 os os os os os os os os os os os 。

$ sed -E 's/^[[:space:]]{1,}([[:alnum:]]{1,}).*$/  @(\1) : @"\1",/g' ObservationType.h

이는 '첫 번째 단어를 줄에 붙여 출력 @(word)' : @"word" ,

이 regex는 'ObservationType'이라는 헤더 파일의 열거형을 변환합니다.h'는 다음을 포함합니다.

typedef enum : int { 
    ObservationTypePulse = 1,
    ObservationTypeRespRate = 2,
    ObservationTypeTemperature = 3,
    .
    .
}

다음과 같은 형태로 변환됩니다.

    @(ObservationTypePulse) : @"ObservationTypePulse",
    @(ObservationTypeRespRate) : @"ObservationTypeRespRate",
    @(ObservationTypeTemperature) : @"ObservationTypeTemperature",
    .
    .

현대적인 구문을 하여 objective-c 구문으로 수 있습니다.@{ } @한 바와 를하여 (@syslog1vn)를 만듭니다.NSDictionary 삭제:

-(NSDictionary *)observationDictionary
{
    static NSDictionary *observationDictionary;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        observationDictionary = [[NSDictionary alloc] initWithDictionary:@{
                                 @(ObservationTypePulse) : @"ObservationTypePulse",
                                 @(ObservationTypeRespRate) : @"ObservationTypeRespRate",
                                 .
                                 .
                                 }];
    });
    return observationDictionary;
}

dispatch_once보일러 플레이트는 정적 변수가 스레드 세이프 방식으로 초기화되도록 하기 위한 것입니다.

이상하다는 것을 했습니다.- ge : OSX sed regex 。+그 이상'을 '하나 또는 그 이상'을 사용하지 '하나 또는 그 이상'을 .{1,}

배리 워크의 대답에 중요한 순서대로 변형을 사용해요.

  1. 컴파일러가 누락된 대소문자 구를 확인할 수 있도록 합니다(기본 구가 있는 경우 확인할 수 없습니다).
  2. (Java와 유사한 이름이 아닌) Objective-C 표준 이름을 사용합니다.
  3. 특정 예외를 발생시킵니다.
  4. 더 짧다.

EG:

- (NSString*)describeFormatType:(FormatType)formatType {    
    switch(formatType) {
        case JSON:
            return @"JSON";
        case XML:
            return @"XML";
        case Atom:
            return @"Atom";
        case RSS:
            return @"RSS";
    }
    [NSException raise:NSInvalidArgumentException format:@"The given format type number, %ld, is not known.", formatType];
    return nil; // Keep the compiler happy - does not understand above line never returns!
}

우선 Format Type에 대해서입니다.JSON: JSON은 FormatType의 멤버가 아닙니다.FormatType의 가능한 값입니다.Format Type은 컴포지트 타입이 아니라 스칼라입니다.

둘째, 매핑테이블을 작성하는 방법밖에 없습니다.를 'Objective-C'가 그러면 다음과 같이 됩니다.NSString *FormatTypeJSON = @"JSON"기타 등등.

다음은 새 열거형을 추가하려면 한 줄의 편집만 필요합니다.이 작업은 열거형 {} 목록에 한 줄을 추가하는 작업과 유사합니다.

//------------------------------------------------------------------------------
// enum to string example
#define FOR_EACH_GENDER(tbd) \
        tbd(GENDER_MALE) \
        tbd(GENDER_FEMALE) \
        tbd(GENDER_INTERSEX) \

#define ONE_GENDER_ENUM(name) name,
enum
{
    FOR_EACH_GENDER(ONE_GENDER_ENUM)
    MAX_GENDER
};

#define ONE_GENDER(name) #name,
static const char *enumGENDER_TO_STRING[] = 
{
    FOR_EACH_GENDER(ONE_GENDER)
};

// access string name with enumGENDER_TO_STRING[value]
// or, to be safe converting from a untrustworthy caller
static const char *enumGenderToString(unsigned int value)
{
    if (value < MAX_GENDER)
    {
        return enumGENDER_TO_STRING[value];
    }
    return NULL;
}

static void printAllGenders(void)
{
    for (int ii = 0;  ii < MAX_GENDER;  ii++)
    {
        printf("%d) gender %s\n", ii, enumGENDER_TO_STRING[ii]);
    }
}

//------------------------------------------------------------------------------
// you can assign an arbitrary value and/or information to each enum,
#define FOR_EACH_PERSON(tbd) \
        tbd(2, PERSON_FRED,     "Fred",     "Weasley", GENDER_MALE,   12) \
        tbd(4, PERSON_GEORGE,   "George",   "Weasley", GENDER_MALE,   12) \
        tbd(6, PERSON_HARRY,    "Harry",    "Potter",  GENDER_MALE,   10) \
        tbd(8, PERSON_HERMIONE, "Hermione", "Granger", GENDER_FEMALE, 10) \

#define ONE_PERSON_ENUM(value, ename, first, last, gender, age) ename = value,
enum
{
    FOR_EACH_PERSON(ONE_PERSON_ENUM)
};

typedef struct PersonInfoRec
{
    int value;
    const char *ename;
    const char *first;
    const char *last;
    int gender;
    int age;
} PersonInfo;

#define ONE_PERSON_INFO(value, ename, first, last, gender, age) \
                     { ename, #ename, first, last, gender, age },
static const PersonInfo personInfo[] = 
{
    FOR_EACH_PERSON(ONE_PERSON_INFO)
    { 0, NULL, NULL, NULL, 0, 0 }
};
// note: if the enum values are not sequential, you need another way to lookup
// the information besides personInfo[ENUM_NAME]

static void printAllPersons(void)
{
    for (int ii = 0;  ;  ii++)
    {
        const PersonInfo *pPI = &personInfo[ii];
        if (!pPI->ename)
        {
            break;
        }
        printf("%d) enum %-15s  %8s %-8s %13s %2d\n",
            pPI->value, pPI->ename, pPI->first, pPI->last,
            enumGenderToString(pPI->gender), pPI->age);
    }
}

많은 답변들이 꽤 좋습니다.

일부 매크로를 사용하는 일반적인 목표 C 솔루션을 찾고 있는 경우...

주요 기능은 열거형을 NSString 상수의 정적 배열에 대한 인덱스로 사용하는 것입니다.배열 자체는 Apple API에서 널리 사용되는 NSStringFromXX 함수 스위트와 같은 함수로 포장됩니다.

가 있다#import "NSStringFromEnum.h"http://pastebin.com/u83RR3Vk 를 참조해 주세요.

에도 [EDIT]가 필요합니다.#import "SW+Variadic.h"http://pastebin.com/UEqTzYLf 를 참조해 주세요.

예 1 : 문자열 변환기를 사용하여 새로운 열거형 형식을 완전히 정의합니다.

myfile.h에 있습니다.


 #import "NSStringFromEnum.h"

 #define define_Dispatch_chain_cmd(enum)\
 enum(chain_done,=0)\
 enum(chain_entry)\
 enum(chain_bg)\
 enum(chain_mt)\
 enum(chain_alt)\
 enum(chain_for_c)\
 enum(chain_while)\
 enum(chain_continue_for)\
 enum(chain_continue_while)\
 enum(chain_break_for)\
 enum(chain_break_while)\
 enum(chain_previous)\
 enum(chain_if)\
 enum(chain_else)\


interface_NSString_Enum_DefinitionAndConverters(Dispatch_chain_cmd)

myfile.m:


 #import "myfile.h"

 implementation_NSString_Enum_Converters(Dispatch_chain_cmd)

사용 방법:

NSString *NSStringFromEnumDispatch_chain_cmd(enum Dispatch_chain_cmd value);

NSStringFromEnumDispatch_chain_cmd(chain_for_c)@"chain_for_c"

  enum Dispatch_chain_cmd enumDispatch_chain_cmdFromNSString(NSString *value);

enumDispatch_chain_cmdFromNSString(@"chain_previous")chain_previous

예 2: 기존 열거형 변환 루틴을 제공합니다.또한 설정 문자열을 사용하여 함수에 사용되는 typeename 이름을 변경하는 방법도 보여줍니다.

myfile.h에 있습니다.


 #import "NSStringFromEnum.h"


 #define CAEdgeAntialiasingMask_SETTINGS_PARAMS CAEdgeAntialiasingMask,mask,EdgeMask,edgeMask

 interface_NSString_Enum_Converters(CAEdgeAntialiasingMask_SETTINGS_PARAMS)

myfile.m:


 // we can put this in the .m file as we are not defining a typedef, just the strings.
 #define define_CAEdgeAntialiasingMask(enum)\
 enum(kCALayerLeftEdge)\
 enum(kCALayerRightEdge)\
 enum(kCALayerBottomEdge)\
 enum(kCALayerTopEdge)



 implementation_NSString_Enum_Converters(CAEdgeAntialiasingMask_SETTINGS_PARAMS)

여기서 작업합니다.-> https://github.com/ndpiparava/ObjcEnumString

//1st Approach
#define enumString(arg) (@""#arg)

//2nd Approach

+(NSString *)secondApproach_convertEnumToString:(StudentProgressReport)status {

    char *str = calloc(sizeof(kgood)+1, sizeof(char));
    int  goodsASInteger = NSSwapInt((unsigned int)kgood);
    memcpy(str, (const void*)&goodsASInteger, sizeof(goodsASInteger));
    NSLog(@"%s", str);
    NSString *enumString = [NSString stringWithUTF8String:str];
    free(str);

    return enumString;
}

//Third Approcah to enum to string
NSString *const kNitin = @"Nitin";
NSString *const kSara = @"Sara";


typedef NS_ENUM(NSUInteger, Name) {
    NameNitin,
    NameSara,
};

+ (NSString *)thirdApproach_convertEnumToString :(Name)weekday {

    __strong NSString **pointer = (NSString **)&kNitin;
    pointer +=weekday;
    return *pointer;
}

필요에 따라 컴파일러 디렉티브를 사용하여 원하는 동작을 시뮬레이트할 수도 있습니다.

 #define JSON @"JSON"
 #define XML @"XML"
 #define Atom @"Atom"
 #define RSS @"RSS"

일반적인 컴파일러의 단점만 기억하십시오(타입이 안전하지 않고 직접 복사 붙여넣기를 하면 소스 파일이 커집니다).

언급URL : https://stackoverflow.com/questions/1094984/convert-objective-c-typedef-to-its-string-equivalent

반응형