【问题标题】:How to use protocols with categories for NSMutableArray如何使用带有 NSMutableArray 类别的协议
【发布时间】:2014-01-31 20:14:04
【问题描述】:

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

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

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

我已经尝试了几件事,我目前认为应该是这样的:

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

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

【问题讨论】:

  • 为什么是<NSMutableArray>
  • 因为我希望我的NDVectors 是可变的。我应该为此使用更好的课程吗?
  • 我想你不明白那个语法在 Obj-C 中的含义。不要将 Java 泛型与也由 表示的 Obj-C 协议混合。
  • @Sulthan 我知道在 Obj-C 中不是这样。这就是为什么我要问它是如何完成的。

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


【解决方案1】:

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

你甚至可以在你的向量类中使用一个init 方法来接收一个数组。

【讨论】:

    【解决方案2】:

    如果我按照正确的方式进行操作,您基本上会想要一个 NSMutableArray 的子类,它 (a) 包含 NDVector 的实例,并且 (b) 具有额外的 NDVector 特定方法,它们对整个数组进行操作。

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

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

    【讨论】:

      【解决方案3】:

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

      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
      

      总结

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

      【讨论】:

      • 子类化一个类集群是一个糟糕的想法,在这种情况下确实行不通。所以你的选择没有。 1 应该被删除。
      • @LeoNatan 这不是真的。在类文档中甚至提到了子类NSMutableArray 的可能性。见developer.apple.com/library/mac/documentation/Cocoa/Reference/…
      • 您真的阅读过文档吗? “在子类中,您必须覆盖所有这些方法。您还必须覆盖 NSArray 类的原始方法。”是的,你可以继承。但是你必须重新实现NSArrayNSMutableArray 的全部功能。很好的解决方案。
      • @LeoNatan 恐怕我错了。不幸的是,在解释问题时,我只阅读了NSMutableArray 文档,而不是NSArray 文档。类集群使用起来太糟糕了..
      • 不用担心。请从您的答案中删除继承。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      相关资源
      最近更新 更多