扩展NSMutableArray以像Java数组一样工作

时间:2012-07-25 23:47:10

标签: objective-c arrays nsmutablearray

我正在为iphone制作RPG游戏。我想要做的是有一个库存,只允许您持有特定数量的特定类型的项目。我想这样做我只是扩展NSMutableArray并添加限制。我无法弄清楚这样做的最好方法。这就是我脑子里的想法......

Backpack.h

@interface Backpack : NSMutableArray {
  Class * arrayClass;
  NSMutableArray * array;
  int limit;
}

-(id) initWithClass:(Class) type andLimit:(int) num;

@end

Backpack.m

@implementation Backpack

  -(id)initWithClass:(Class) type andLimit:(int) num {

    arrayClass = type;
    limit = num;
    array = [NSMutableArray new];
    return self;

  }

  -(void)insertObject:(id) object atIndex:(int) index {

    if([object isKindOfClass:arrayClass] && index < limit) {
      // Insert it
    } else {
      // Throw Exception
    }

  }

@end

2 个答案:

答案 0 :(得分:5)

不是扩展NSMutableArray,而是创建自己的类,该类使用NSMutableArray实例来保存项目。您的类可以有一个或多个add方法,这些方法或方法要求将项添加到某个类类型(或实现特定接口)。至于限制项目数量,在addItem方法的一侧,首先检查所持有的项目数量。如果它大于您的限制,则不允许添加该项目。最后,你的类可以公开一个size方法(例如getSize()),它告诉你在NSMutableArray的实例中已经内部保存了多少项,这样你就可以防止在你的背包“满”时添加项目形式。 / p>

一般来说,组合(即从其他类的成员实例组成自己的类)比扩展类和使用继承来完成相同的行为要好。例如,如果扩展NSMutableArray,那么除了你的方法之外,生成的类将公开该类的所有公共方法,从而导致从代码重用和文档角度看出一个混乱的类。

最后,你的问题实际上与Java无关,所以也许这不应该用Java标签标记。

答案 1 :(得分:1)

你想要施加的限制实际上并不需要类扩展,如果有什么东西让它混淆使用和难以编写。

保持简单,并将一些与库存相关的方法添加到类似自定义Player类的方法中,您可能希望在制作RPG的过程中设计它。

@interface Player : NSObject {
  NSMutableArray * inventory;
  NSUInteger inventoryLimit;
  //other centralized player data like stats, spells, or whatever
}
-(BOOL)addItemToInventory:(YourItemClass *)item;
@end

@implementation 
//... other impl stuff, like init
-(BOOL)addItemToInventory:(YourItemClass *)item {
  if([inventory count] < inventoryLimit) {
    [inventory addObject:item];
    return TRUE;
  }
  else {
    return FALSE;
  }
}
@end

请注意,我对“玩家”课程的建议并不是一项艰难的要求。您可以通过多种方式为游戏构建类和数据......