读取未在类型&#39; id <protocolname>&#39;的对象上找到的数组元素的预期方法

时间:2018-04-03 10:02:32

标签: ios objective-c xcode xcode9 xcode9.3

我想更新XCode版本。

但是在更新时我收到了几个编译器错误。与此相同:

id<MyProtocol> objectToDelete = group[index.unsignedIntegerValue];

  

读取未在类型&#39; id&#39;

的对象上找到的数组元素的预期方法

id<MyProtocol> _Nonnull group

@protocol MyProtocol <NSObject>

@property (copy, nonatomic) NSString* name;
@property (copy, nonatomic) NSString* id;
@property (copy, nonatomic) NSString* internalType;
@property (strong, nonatomic) NSMutableArray<id<SomeAnotherProtocol>>* objects;

- (instancetype)initWithObject:(MyProtocol*)object;
// Search
- (BOOL)isContainsObjectWithID:(NSString*)myID;
- (NSUInteger)indexForObjectID:(NSString*)myID;
- (id<SomeAnotherProtocol>)objectWithID:(NSString*)myID;
- (NSString*)groupID;

@end

此错误仅出现在XCode 9.3版本上。

id<MyProtocol> objectToDelete = ((NSArray *) group)[index.unsignedIntegerValue];是唯一的解决方案吗?

2 个答案:

答案 0 :(得分:2)

首先,我假设group实际上不是NSArray,但实际上是:

id<MyProtocol> _Nonnull group

这表示group是“某个符合MyProtocol的对象”。 MyProtocol中没有任何内容表示此对象可以下标。如果您希望它可以通过索引进行订阅,那么您需要在协议中说明这一点:

@protocol MyProtocol <NSObject>
- (id<MyProtocol>)objectAtIndexedSubscript:(NSUInteger)idx;
...

你当然需要在符合的任何事情中实现objectAtIndexedSubscript:(但这似乎已经是这种情况,因为当你施放它时它会起作用)。

答案 1 :(得分:-1)

试试这个: [group objectAtIndexedSubscript:idx]