0

这是一个新手问题。我有一个如下所示的对象(例如MyObject.h)。

#import <Foundation/Foundation.h>
#import "JSONModel.h"
@protocol MyObject
@end
@interface MyObject : JSONModel
@property (strong,nonatomic) NSString* name;
@end

实现如下所示(例如MyObject.m)。

#import "MyObject.h"
@implementation MyObject
@end

在其他地方的代码中,我定义 aNSMutableArray如下。

NSMutableArray<MyObject>* list;
list = [[NSMutableArray alloc] init];

我得到了这个警告。

从 'NSMutableArray '分配 'NSMutableArray<MyObject> ' 的指针类型不兼容

我知道Objective-C不支持开箱即用的泛型集合(这也不是我在这里想要做的),但我NSMutableArray是用这样的协议定义的,MyObject因为我试图遵循“JSONModel's” GitHub 页面中的示例

代码仍然可以编译,但有上面的警告。我如何

  • 使警告消失,或
  • 正确分配/初始化NSMutableArray

更新:

我继续搜索如何摆脱该警告,事实证明,如果我创建NSMutableArray如下内容,警告就会消失(并且项目编译没有错误)。我将编写一个单元测试,看看它是否按预期工作。

list = (id)[NSMutableArray new];
4

1 回答 1

5
NSMutableArray<MyObject>*

这并不意味着你认为这意味着什么。这不是“NSMutableArray符合的事物<MyObject>”。这是“NSMutableArray它本身符合的子类<MyObject>”。

我不知道您提供的链接试图实现什么。也许他们是子类化NSArray的,或者他们已经NSArray用一个试图符合协议的类别进行了装饰。在任何一种情况下,这都介于危险和疯狂之间。我会和他们谈谈他们的想法。我怀疑他们这样做是作为一种装饰,似乎意味着什么,实际上没有任何意义。(这并非闻所未闻。Apple 自己使用CFPropertyListRef,这似乎意味着什么,但实际上是const void*,当您期望一个永远不会出现的警告时,这可能会非常令人惊讶。)

对于如何摆脱警告的问题,只需摆脱不正确的协议修饰即可。应该是NSMutableArray*,不是NSMutableArray<something>*

顺便说一句,此代码为您提供了零和微不足道的好处:

NSMutableArray<MyObject>* list = (id)[NSMutableArray new];

它给你一个小小的好处,因为稍后调用list = someOtherKindOfList会发出警告,但这是一个非常不寻常的操作(90% 的时间你无论如何都必须强制转换它,所以警告几乎永远不会捕获真正的错误)。然而,最值得注意的是,如果你这样做,它不会发出警告[list addObject:someRandomType],这是在这里犯错的最常见方式。所以装饰没有意义。

于 2014-05-13T18:40:01.327 回答