我正在尝试向NSMutableArray
添加一个类别,以允许我将其用作2D数组(由1D数组支持,使用将x& y索引转换为平面索引的方法)。由于我不允许将实例变量添加到类别中,我应该如何跟踪计算数组索引所需的行数和列数?
这是界面:
@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
?如果我是子类,它将是一个普通的旧ivar。
我完全希望被告知创建一个以NSMutableArray
作为属性的新类,但我想看看是否有办法首先使用类别。
非常感谢。
答案 0 :(得分:4)
在10.6及更高版本(我不确定iOS),您可以使用objc_setAssociatedObject
将任意事物与对象相关联,请参阅this Apple doc。您可以使用此机制“添加”和ivar。
但我认为最好创建一个以NSMutableArray
为属性的新类。这样,您可以在类型级别区分1d数组和2d数组,以便编译器可以发出警告。例如,您不想在二维数组上意外使用objectAtIndex:
,对吧?
答案 1 :(得分:2)
如果你真的需要一个具有NSMutableArray
和接口的类,你的二维数组操作可能应该是NSMutableArray
的子类。由于这是一个类集群,因此您还必须实现NSArray
和NSMutableArray
的基本操作。这些是count
,objectAtIndex:
,insertObject:atIndex:
,removeObjectAtIndex:
,addObject:
,removeLastObject
和replaceObjectAtIndex:withObject:
以及任何{{init
1}} - 您需要的方法。然后,您可以自己实现存储,或者只是将它们转发到NSMutableArray
实例变量。
但正如Yuji建议的那样,你可能会为你的2d阵列增加一个新课程。