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

Leo*_*rdo 5 enums objective-c

我试图实现一个简单的方法,但我仍然是objective-c的新手.

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

这是枚举

typedef enum {
   DXTypeUnknown = 0,
   DXDatasource = 1,
   DXGroup = 2
} DXPropertyType;
Run Code Online (Sandbox Code Playgroud)

这是相关的方法:

-(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];
    } 
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

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

sid*_*yll 4

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

if (![_type respondsToSelector:@selector(intValue)])
    return nil;
Run Code Online (Sandbox Code Playgroud)

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

- (DXPropertyType)typeFromObject:(NSNumber)_type;
Run Code Online (Sandbox Code Playgroud)

在您的代码中,您将返回一个 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;
    } 
}
Run Code Online (Sandbox Code Playgroud)

然后这可以简化为:

- (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;
}
Run Code Online (Sandbox Code Playgroud)