Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何为NSMutableArray使用具有类别的协议_Objective C_Nsmutablearray_Protocols_Objective C Category - Fatal编程技术网

Objective c 如何为NSMutableArray使用具有类别的协议

Objective c 如何为NSMutableArray使用具有类别的协议,objective-c,nsmutablearray,protocols,objective-c-category,Objective C,Nsmutablearray,Protocols,Objective C Category,我不认为我在这个网站上找到了一个和我自己的很像的例子,尽管我确信这会一直出现,而且我刚刚在年完成了关于这个主题的一章 我不想寻找任何复杂的东西,但我只想为某一类型的对象添加一些功能,因为我不想子类化NSMutableArray,因为这看起来太难了,但我可能会改变主意 我想要一个类别,该类别提供符合NDVector协议的NSMutableArrays执行某些操作的能力,如计算范数、绕轴旋转等。 我已经尝试了一些方法,目前我认为应该是这样的: 创建一个协议:@protocolndvector并在那

我不认为我在这个网站上找到了一个和我自己的很像的例子,尽管我确信这会一直出现,而且我刚刚在年完成了关于这个主题的一章

我不想寻找任何复杂的东西,但我只想为某一类型的对象添加一些功能,因为我不想子类化
NSMutableArray
,因为这看起来太难了,但我可能会改变主意

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

我已经尝试了一些方法,目前我认为应该是这样的:

  • 创建一个协议:
    @protocolndvector
    并在那里声明方法
  • 创建一个类别
    @interface NSMutableArray(NDVector)
    ,该类别将。。。还声明了方法吗
  • 实现该类别实现中的方法
    @implementation NSMutableArray(NDVector)
  • 最后,以某种方式实例化一个
    NSMutableArray
    (我来自Java),对象如下
    NSMutableArray vec=[[NSMutableArray alloc]init]

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

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

一,。继承权

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

二,。封装

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

@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
三,。类别

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

@interface NSMutableArray (NDVector)

//add the methods you want

@end

@implementation NSMutableArray (NDVector)

//implement any methods you want
@end
总结


在我看来,第三个将很难使用。第二种方法很容易实现和使用。

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


你甚至可以在向量类中有一个采用数组的
init
方法。

如果我没有弄错的话,你基本上会想要一个
NSMutableArray
的子类,它(a)保存
NDVector
的实例,并且(b)有额外的
NDVector
特定方法,这些方法作为一个整体在数组上运行

第一个子类
NSMutableArray
,它并不难,而且可以在中找到执行此操作的代码(a)-该代码设计用于任何类型。您可以将其专门化为
NDVector
,也可以添加
insertVector:atIndex:
和类似方法,以避免
insertObject:atIndex:
中存在的运行时检查


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

为什么
?因为我希望我的
NDVector
是可变的。有没有一个更好的类我应该用这个?我想你不明白Obj-C中的语法是什么意思。不要将Java泛型与Obj-C协议混合使用,Obj-C协议也由<…>表示@Sulthan我知道Obj-C中不是这样做的。这就是为什么我要问它是如何做到的。将类集群子类化是一个糟糕的想法,在这种情况下确实不起作用。所以你的选项1应该被删除。@LeoNatan那不是真的。类文档中甚至提到了子类
NSMutableArray
的可能性。看,你真的读过文档了吗?“在子类中,您必须重写所有这些方法。您还必须重写NSArray类的基本方法。”是的,您可以创建子类。但是您必须重新实现
NSArray
NSMutableArray
的全部功能。伟大的解决方案。@LeoNatan恐怕我错了。不幸的是,在解释问题时,我只阅读了
NSMutableArray
文档,而不是
NSArray
文档。类集群使用起来太糟糕了……不用担心。请从您的答案中删除继承。