【问题标题】:convert id into enum using objective-c使用objective-c将id转换为枚举
【发布时间】:2011-07-08 13:10:12
【问题描述】:

我正在尝试实现一个简单的方法,但是我仍然是 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,然后查看它是否属于两个相关类别组或数据源,否则返回默认值。你能告诉我我实施的开关/案例是否是一个合适的解决方案吗? 我也希望这种方法不会导致应用程序崩溃,所以建议检查什么,记住在任何情况下都将返回默认值。

谢谢

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

【问题讨论】:

  • id 是什么?它是任何随机对象还是特定类的实例?
  • 目前是一个从 plist 中取出的对象,并存储在字典中,并用 [dict objectForKey] 调用,但我想扩展这个案例并考虑任何随机对象。跨度>

标签: objective-c enums


【解决方案1】:

包含此代码以检查是否可以使用 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;
}

【讨论】:

  • 抱歉@Leonardo,我没有看到您编辑了您的问题,要求返回的值应该是 NSNumber。
  • uhm...我认为大部分代码也可以用于 NSNumber 返回,你知道'id'是否响应 intValue 是否意味着它总是可以转换为 int ?在最坏的情况下,值为 '1xy' 的 id 会响应 intValue 吗?
  • @Leonardo:id 表示任何类型的对象。因此,您可以将 NSPipe 传递给此方法。它不是保存整数的东西,它不响应 intValue 方法,因此返回 nil。否则,在不“接受”的对象中调用intValue 会崩溃。如果您将参数声明为仅接受 NSNumber,正如我在答案中所说,它会正常工作,但在某些情况下保留为 id 会更好。例如,NSString 也有一个 intValue 方法,因此您可以将一个 NSString @"2" 传递给您的方法,它会起作用。
  • 嗨@sidyll。我尝试使用这个“if (![_type respondsToSelector:@selector(intValue)]) return nil;”。但是编译器说:接收器类型不是Objective-C类。也许你可以在这里帮助我:stackoverflow.com/questions/14853518/…
【解决方案2】:

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

但是,当您的方法期望不同的返回值时,它会返回一个 NSNumber。我建议将方法更改为

-(NSNumber)typeFromObject:(id)_type

【讨论】:

    【解决方案3】:

    您指定您的方法返回一个枚举,但您返回的是对象。所以要么返回枚举值,要么指定返回类型为NSNumber *

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多