Метод получения строки из перечисления - PullRequest
3 голосов
/ 23 июля 2011

Мне было интересно, есть ли элегантный способ получить строку из перечисления в Objective-C или vanilla C. В настоящее время я использую оператор switch следующим образом:

switch (self.requestType) 
{
    case MSListRequest:
        serverRequestType = @"List";
        break;
    case MSDetailsRequest:
        serverRequestType = @"Details";
        break;
    case MSPurchaseRequest:
        serverRequestType = @"PurchaseVolume";
        break;
}

Мне любопытно, есть ли более чистый способ получения строк, чем этот.

-edit: Я также использую то же самое перечисление в другом месте, чтобы взаимодействовать с другой системой, которая должна сопоставить те же самые перечисления с другим набором строк.

1 Ответ

0 голосов
/ 23 июля 2011

Нет реального хорошего способа сделать это.Очень простой способ - создать массив:

NSString *const ENUM_NAMES[] = {
    @"List", @"Details", @"PurchaseVolume", ...
};

Существуют альтернативы, в которых используются макросы и некоторые простые приемы препроцессора для определения имен и самого перечисления из одного и того же источника.Однако результирующий код труднее читать.

// some_enum.def
X(List),
X(Details),
X(PurchaseVolume)

// some_enum.h
enum {
    #define X(x) x
    #include "some_enum.def"
    #undef X
};

// some_enum.c
char const *const ENUM_STRING[] = {
    #define X(x) #x
    #include "some_enum.def"
    #undef X
};

Я не уверен в лучшем способе генерации строки NSSt из препроцессора, можете ли вы просто вставить в нее @ или, еслилучше использовать (NSString *)CFSTR(x).

Когда мне нужен такой код, я пишу скрипт Python для генерации кода из текстового файла - он генерирует вывод GPerf для преобразования строк в enum, ион также генерирует код для преобразования enum в строку.Обычный старый С не делает отражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...