我正在尝试实现一个简单的方法,但我仍然是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,所以可能有一个更好的解决方案而不是枚举。
答案 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]
。