使用objective-c将id转换为枚举

时间:2011-07-08 13:10:12

标签: objective-c enums

我正在尝试实现一个简单的方法,但我仍然是Objective-c的新手。

我有这个简单的方法,如果匹配,它会尝试从枚举转换为枚举中的特定值。

这是枚举

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];
    } 
}

我要实现的第一个检查是id是否可以转换为int,然后查看它是否属于两个相关的类别组或数据源,否则返回默认值。你能告诉我我实施的开关/箱子是否是一个合适的解决方案? 我也希望这种方法不会导致应用程序崩溃,所以最好检查一下,记住在任何情况下都要返回默认值。

感谢

[编辑] 我忘了说这个值将存储在NSManagedObject的一个字段中,由CoreData限制可以是一个NSNumber,所以可能有一个更好的解决方案而不是枚举。

3 个答案:

答案 0 :(得分:4)

包含此代码以检查是否可以使用id可能是个好主意:

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

但是,如果您将始终传递NSNumber,请将该方法声明为:

- (DXPropertyType)typeFromObject:(NSNumber)_type;

在您的代码中,您将返回NSNumber。我不认为那就是你真正的 想要,因为你通过NSNumber什么都不做。返回枚举 项:

-(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;
}

答案 1 :(得分:0)

您的switch语句是一个很好的解决方案,不会导致崩溃。

但是,您的方法在需要不同的返回值时会返回NSNumber。我建议将方法更改为

-(NSNumber)typeFromObject:(id)_type

答案 2 :(得分:0)

指定您的方法返回枚举,但返回对象。因此,要么返回枚举值,要么将返回类型指定为NSNumber *

一个不同的解决方案可能是使用单例对象而不是枚举,但这可能比它的价值更多。想想[NSNull null]