在 'id<ProtocolName>' 类型的对象上找不到读取数组元素的预期方法

Expected method to read array element not found on object of type 'id<ProtocolName>'

我想更新 XCode 版本。

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

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

Expected method to read array element not found on object of type 'id'

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]; 是唯一的解决方案吗?

试试这个: [组objectAtIndexedSubscript:idx]

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

id<MyProtocol> _Nonnull group

这表示 group 是 "some object that conforms to MyProtocol"。 MyProtocol 中没有任何内容表明该对象可以被下标。如果你想让它被索引订阅,那么你需要在协议中这样说:

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

你当然需要在任何符合的情况下实现 objectAtIndexedSubscript:(但这似乎已经是这种情况,因为它在你投射时有效)。