конвертировать id в enum, используя target-c - PullRequest
5 голосов
/ 08 июля 2011

Я пытаюсь реализовать простой метод, однако я все еще новичок в target-c.

У меня есть этот простой метод, который пытается преобразовать идентификатор в конкретное значение в enum,если соответствует.

Это перечисление

typedef enum {
   DXTypeUnknown = 0,
   DXDatasource = 1,
   DXGroup = 2
} DXPropertyType;

И это соответствующий метод:

-(DXPropertyType)typeFromObject:(id)_type {
    int _t = [_type intValue];

    switch (_t) {
        case DXDatasource:
            return [NSNumber numberWithInt:DXDatasource];
        case DXGroup:
            return [NSNumber numberWithInt:DXGroup];


        default:
            return [NSNumber numberWithInt:DXTypeUnknown];
    } 
}

Самая первая проверка, которую я хотел бы реализовать, это если идентификаторможно преобразовать в целое число, а затем посмотреть, попадает ли оно в две соответствующие категории или источник данных, или вернуть значение по умолчанию, если нет.Не могли бы вы сказать мне, является ли переключатель / случай, который я реализовал, является правильным решением или нет?Я также хотел бы, чтобы этот метод не вызывал сбой приложения, поэтому рекомендуется проверить его, учитывая, что в любом случае должно быть возвращено значение по умолчанию.

спасибо

[РЕДАКТИРОВАТЬ] Я забыл сказать, что это значение будет храниться в поле NSManagedObject, который по ограничению CoreData может быть NSNumber, поэтому, вероятно, есть лучшее решение вместо перечисления.

Ответы [ 3 ]

4 голосов
/ 08 июля 2011

Было бы неплохо включить этот код, чтобы проверить, можно ли использовать id:

if (![_type respondsToSelector:@selector(intValue)])
    return nil;

Однако, если вы всегда будете передавать NSNumber, объявите метод следующим образом:

- (DXPropertyType)typeFromObject:(NSNumber)_type;

В вашем коде вы возвращаете NSNumber. Я не думаю, что это то, что вы на самом деле хочу, так как вы ничего не будете делать с пройденным NSNumber. Вернуть enum пункт:

-(DXPropertyType)typeFromObject:(id)_type {

    if (![_type respondsToSelector:@selector(intValue)])
        return nil;

    int _t = [_type intValue];

    switch (_t) {
        case DXDatasource:
            return DXDatasource;
        case DXGroup:
            return DXGroup;


        default:
            return DXTypeUnknown;
    } 
}

И тогда это можно упростить до:

- (DXPropertyType)typeFromObject:(id)_type {

    if ([_type respondsToSelector:@selector(intValue)]) {

        int t = [_type intValue];
        DXPropertyType property_t;

        if (t >= 1 && t <= 2)
            property_t = t;
        else
            property_t = DXTypeUnknown;

        return property_t;
    }
    return nil;
}
0 голосов
/ 08 июля 2011

Вы указываете, что ваш метод возвращает перечисление, но вы возвращаете объекты.Так что либо возвращайте значения перечисления, либо укажите тип возвращаемого значения NSNumber *.

. Другим решением может быть использование одноэлементных объектов вместо перечисления, но это, вероятно, больше работы, чем стоит.Подумайте [NSNull null].

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

Ваш оператор switch является хорошим решением и не приведет к сбою.

Однако ваш метод возвращает NSNumber, когда ожидает другого возврата.Я предлагаю изменить метод на

-(NSNumber)typeFromObject:(id)_type
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...