Распаковка упакованных примитивов (таких как enum) из NSArray или NSDictionary во время быстрого перечисления

Вы можете поместить примитивы в NSArray или NSDictionary, упаковав их с помощью синтаксиса @(). Например:

typedef enum {
    MyEnumOne,
    MyEnumTwo
} MyEnum

NSDictionary *dictionary = @{
                             @(MyEnumOne) : @"one",
                             @(MyEnumTwo) : @"two"
                             };

Но как вы тогда используете это с быстрым перечислением? Например, что-то вроде:

for (MyEnum enum in dictionary) {
    ...
}

Это приводит к ошибке Selector element type 'MyEnum' is not a valid object

1 ответ

@() синтаксис создает в штучной упаковке NSNumber. Поэтому при перечислении обращайтесь к нему как к номеру NSN. Чтобы привести его обратно к перечислению, сначала извлеките целочисленное значение, затем приведите:

for (NSNumber *number in dictionary) {
    MyEnum myEnum = (MyEnum)[number intValue];
    ...
}
Другие вопросы по тегам