如何使用NSMutableArray类别的协议

时间:2014-01-31 20:14:04

标签: objective-c nsmutablearray protocols objective-c-category

我不认为我在这个网站上找到了一个与我自己相似的例子,尽管我确定这会一直弹出,我刚刚在my book完成了关于这个主题的章节。

我不是在寻找任何复杂的东西,但我只想为NSMutableArray添加一些特定类型的对象的功能,因为我不想继承NSMutableArray因为它似乎太难了,但我可能会改变主意。

我想要一个提供NSMutableArray符合NDVector协议的类别能够执行某些操作,例如计算范数,围绕轴旋转等等。

我尝试了几件事,我现在认为它应该是这样的:

  • 制定协议:@protocol NDVector <NSMutableArray>并在那里声明方法
  • 创建一个类别@interface NSMutableArray (NDVector),...也声明方法?
  • 在该类别的实施@implementation NSMutableArray (NDVector)
  • 中实施方法
  • 最后,以某种方式实例化NSMutableArray<NDVector>(我来自Java),像这样的对象NSMutableArray<NDVector> vec = [[NSMutableArray alloc] init]

我该怎么做呢?请不要只发送一个链接,提供与我的方法相似的解释,但需要采取正确的步骤。

3 个答案:

答案 0 :(得分:2)

目前的方法都不是最好的方法。我建议你创建一个矢量类,恰好在它自己的实现中使用一个可变数组。

你的vector类中甚至可以有一个带有数组的init方法。

答案 1 :(得分:0)

我不确定我是否理解你的问题。如果你想对一组向量进行一些操作,那么你基本上有三种可能性:

1。继承

对于NSMutableArray,子类化实际上不是一个选项,因为它要求我们重新实现数组。

2。封装

数组隐藏在(在类扩展中)内部,无法直接访问。

@interface NDVectorArray : NSObject

- (void)addVector:(NDVector *)vector;

//TODO: add the methods you want

@end

@interface NDVectorArray ()

@property (nonatomic, strong, readwrite) NSMutableArray *elements;

@end

@implementation NDVectorArray

- (void)addVector:(NDVector *)vector {
   [self.elements addObject:vector];
}

//add the methods you want

@end

3。分类

这只添加方法,不包含对象类型的检查。

@interface NSMutableArray (NDVector)

//add the methods you want

@end

@implementation NSMutableArray (NDVector)

//implement any methods you want
@end

摘要

在我看来,第3名将很难使用。第二个将易于实施和使用。

答案 2 :(得分:0)

如果我按照正确的方法,你基本上想要一个NSMutableArray的子类,其中(a)代表NDVector的实例,(b)具有额外的NDVector特定的方法,这些方法对数组作为一个整体。

第一个子类NSMutableArray,它并不难,代码和(a)可以在this answer中找到 - 该代码可以用于任何类型。您可以将其专门化为NDVector,您可能还想添加insertVector:atIndex:和类似的方法,以避免insertObject:atIndex:中出现运行时检查。

其次只需将(b)的额外方法添加到此类中。