【问题标题】:Expected method to read array element not found on object of type 'id<ProtocolName>'在“id<ProtocolName>”类型的对象上未找到读取数组元素的预期方法
【发布时间】:2018-09-12 14:47:08
【问题描述】:

我想更新 XCode 版本。

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

id&lt;MyProtocol&gt; objectToDelete = group[index.unsignedIntegerValue];

在“id”类型的对象上未找到读取数组元素的预期方法

id&lt;MyProtocol&gt; _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&lt;MyProtocol&gt; objectToDelete = ((NSArray *) group)[index.unsignedIntegerValue]; 是唯一的解决方案吗?

【问题讨论】:

  • id&lt;MyProtocol&gt; objectToDelete = [group objectAtIndex:index.unsignedIntegerValue]; 也可以解决问题。
  • @Larme No known instance method for selector 'objectAtIndex:'

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


【解决方案1】:

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

id<MyProtocol> _Nonnull group

这表示group 是“符合MyProtocol 的某个对象”。 MyProtocol 中没有任何内容表明该对象可以下标。如果你希望它可以被索引下标,那么你需要在协议中这样说:

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

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

【讨论】:

    【解决方案2】:

    试试这个: [group objectAtIndexedSubscript:idx]

    【讨论】:

    • 注意添加任何信息,说明为什么发布者应该尝试那个?
    • 因为他的项目使用 xcode 9.2,但使用 xcode 9.3 失败。因此,如果group[...] 有效,而objectAtIndex:index 失败,我建议,某处对象group 实现objectAtIndexedSubscript: 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多