我正在尝试实现一个简单的方法,但我在 Objective-C 方面仍然是一个新手。
我有一个简单的方法,如果匹配,它会尝试从 id 转换为枚举中的特定值。
这是枚举
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,然后查看它是否属于两个相关类别组或数据源,如果不属于则返回默认值。你能告诉我我实现的 switch/case 是否是一个合适的解决方案吗? 我也希望这种方法不会导致应用程序崩溃,因此建议检查什么,请记住在任何情况下都将返回默认值。
谢谢
[编辑] 我忘了说这个值将存储在 NSManagedObject 的一个字段中,根据 CoreData 的限制,它可以是一个 NSNumber,所以可能有更好的解决方案而不是枚举。
最佳答案
包含此代码以检查是否可以使用 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;
}
关于objective-c - 使用 objective-c 将 id 转换为枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6624895/