【问题标题】:Optimal way to initialize varying objects初始化不同对象的最佳方法
【发布时间】:2010-04-24 22:38:30
【问题描述】:

我必须根据一个整数参数初始化很多不同类型的对象。它们都有相同的整体初始化方法。

目前我有以下代码

#def APPLE 1
#def PEAR 2
switch (t)
{
    case APPLE:
      newobj = [[FApple alloc] init];
      break;
    case PEAR:
      newobj = [[FPear] alloc] init];
      break;
    default:
      retobj = nil;
}

我相信一定有更好的方法来做到这一点。当我添加 FOrange 时,我必须在此处添加另一行。

有什么更好的方法?

【问题讨论】:

  • 你的班级必须这样设计吗?似乎拥有一个 Class 参数并执行 [[thatClass alloc] init] 会更有意义。

标签: iphone c objective-c cocoa


【解决方案1】:

你需要一个映射number -> type的地方,但你不需要重复代码:

NSDictionary* d = [NSDictionary dictionaryWithObjectsAndKeys:
                   [FPear  class], [NSNumber numberWithInt:PEAR ],
                   [FApple class], [NSNumber numberWithInt:APPLE],
                   nil];    

Class c = [d objectForKey:[NSNumber numberWithInt:t]];
id x = [[c alloc] init];

【讨论】:

  • 出于兴趣,有没有办法让 [FPear class] 存储自己的 id,这样我就可以写 [NSNumber numberWithInt:[[FPear class] id] ]?
  • @John:当然,您可以使用类方法,例如+(NSNumber*)myId.
【解决方案2】:

我不认为你正在做的事情有什么问题(尽管使用枚举类型可能比#defines 更不容易出错),但你可能想看看NSClassFromString(),它做了什么顾名思义:

- (id)newFruit:(NSString *)classString { //pass in @"FApple" or @"FPear"
    Class fruitClass = NSClassFromString(classString);
    return [[fruitClass alloc] init];
}

不过,这也可能会对性能造成轻微影响。

【讨论】:

    猜你喜欢
    • 2015-07-16
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2018-03-09
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    相关资源
    最近更新 更多