Эффективный способ создания упорядоченного набора строковых значений в Objective-C - PullRequest
1 голос
/ 18 мая 2011

Я хочу создать подобный enum набор строк таким способом, который также даст мне возможность упорядочить их по порядковому значению, а НЕ по буквенному значению. например:

"Чрезвычайно низкий" = 0

"Очень низкий" = 1

«Низкий» = 2

"Средний = 3

"Высокий" = 4

и т. Д.

Я знаю, что, например, в Java и C # типы enum могут иметь значение помимо своего порядкового значения.

Есть ли способ достичь той же цели в Objective-C?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 18 мая 2011

Я не знаю прямой способ сделать это.Тем не менее, вы можете определить класс Obj-C следующим образом:

@interface EnumLike : NSObject
{
    NSString* title;
    NSInteger value;
}

@property (nonatomic, readonly) NSString* title;
@property (nonatomic, readonly) NSInteger value;

// Something like enum
+ (id)extremelyLow;
+ (id)veryLow;
...
+ (id)high;
};

За исключением работы с switch , это может сделать эту работу.Время от времени я использую подобные типы для объявления некоторых «перечислений» для пользователя, поскольку список таких экземпляров может быть привязан к NSArrayController и использован в пользовательском интерфейсе.

1 голос
/ 18 мая 2011

Просто сохраните строки для ввода / вывода и используйте перечисление для всех ваших вычислений. Например, определите ваше перечисление:

typedef enum { ExtremelyLow, VeryLow, ... High } Rating;

Вы можете использовать это перечисление в switch операторах и т. Д. Теперь вы можете использовать NSArray или просто C-массив для отображения из литералов перечисления в строки:

NSString *RatingToString[] = { @"Extremely Low", @"Very Low", ..., @"High" };

Rating myRating;
NSString *strMyRating = RatingToString[myRating];

Переход от строковой версии к перечислению более сложен, вы можете использовать тот же массив RatingToString и выполнять соответствующие сравнения (возможно, без учета регистра, нечетко и т. Д.). Вы также можете использовать NSDictionary:

NSDictionary StringToRating = [NSDictionary dictionaryWithObjectsAndKeys: RatingToString[ExtremelyLow], [NSNumber numberWithInt:ExtremelyLow, ..., nil];

Теперь поиск будет точно соответствовать вашей строке и вернет Rating в виде NSNumber.

0 голосов
/ 18 мая 2011

Вы можете использовать класс, подобный предложенному Gobra, или массив структур c:

typedef struct {
    int                      type;
    NSString                 *desc;
} NXENumToNSString;



NXENumToNSString kNXGMWidgetTypes[] = {
    {1, @""},
    {2, @"imageGallery"},
    {3, @"dotImageGallery"},
    {4, @"video"},
    {5, @"webView"},
    {6, @"image"}
};

NSInteger  
intToStringForArray(NXENumToNSString *buffer, size_t length, NSString *str) 
{
    int result = NSIntegerMin;
    NXENumToNSString *scan, *stop;  
    scan = buffer;
    stop = scan + length;
    while (scan < stop) {
        if ([scan->desc isEqualToString:str]) {
            result = scan->type;
            break;
        }
        scan++;
    }
    return result;
}

, тогда вы можете сделать что-то вроде этого:

 size_t l = sizeof(kNXGMWidgetTypes) / sizeof(NXENumToNSString);
 NSInteger result = intToStringForArray(kNXGMWidgetTypes, l, str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...