2010-09-09 97 views
2

我正在尝试向NSMutableArray添加一个类别,以允许我将它用作二维数组(由1D数组支持,并将方法将x索引转换为平面索引)。由于我不允许将实例变量添加到类别中,因此我应该如何跟踪计算数组中索引所需的行数和列数?类别和实例变量

这里的接口:

@interface NSMutableArray (TK2DMutableArray) 
- (id) initWithColumns:(int) columns rows:(int) rows; 
- (id) objectAtColumn:(int) col row:(int) row; 
- (void) putObject:(id) object atColumn:(int) x Row:(int) y; 
@end 

这里是实现:

@implementation TK2DMutableArray 

- (id) initWithColumns:(int) x rows:(int) y { 
    self = [self initWithCapacity:x * y]; 

    return self; 
} 

- (id) objectAtColumn:(int) col row:(int) row { 
    return [self objectAtIndex:[self indexAtColumn:col row:row]]; 
} 

- (void) putObject:(id) object atColumn:(int) x row:(int) y { 
    [self replaceObjectAtIndex:[self indexAtColumn:x row:y] withObject:object]; 
} 

- (int) indexAtColumn:(int) col row:(int) row { 
    return (col + (row * rows)); 
} 

@end 

我最初的代码它作为NSMutableArray一个子类;我现在知道,在集群上阅读了一些内容是一个错误。问题是在最后一个方法 - 我应该怎么做rows?如果我是继承人,那会是一个普通的老伊娃。

我完全期待被告知创建一个新的类,作为一个属性NSMutableArray,但我想看看是否有办法用类别先做它。

非常感谢。

+0

[Objective-C:类别中的实例变量]的可能重复(http://stackoverflow.com/questions/6162589/objective-c-instance-variable-in-category) – hfossli 2014-01-16 08:23:08

回答

4

在10.6及更高版本(我不确定iOS)时,可以使用objc_setAssociatedObject将任意事物关联到对象,请参阅this Apple doc。你可以使用这个机制来“添加”和伊娃。

但我认为你最好创建一个新的类,NSMutableArray作为一个属性。这样,您可以在类型级别区分1d数组和2d数组,以便编译器可以警告您。例如,你不想在二维数组上意外使用objectAtIndex:,对吧?

+0

OK谢谢,值得一试。协会可能会工作,但我同意你的看法:新的课程。 – 2010-09-09 19:02:05

2

如果你真的需要有NSMutableArray你的二维数组的操作你应该继承NSMutableArray接口的类。由于这是一个类集群,因此您还必须实施NSArrayNSMutableArray的基本操作。这些是count,objectAtIndex:,insertObject:atIndex:,removeObjectAtIndex:,addObject:,removeLastObjectreplaceObjectAtIndex:withObject:以及任何init-您需要的方法。然后,您可以自己实施存储或将其转发给NSMutableArray实例变量。

但是,如Yuji所建议的,您可能更适合为2d阵列创建新类。

+0

谢谢你的详细回复斯文。对于这样一个简单的要求,工作太多了。支持数组作为ivar的新类可以很好地工作,但如果在此处需要完整列表,则需要使用其他方法。 – 2010-09-09 19:04:43