2015-10-20 5 views
2

У меня есть собственный набор коллекций с общей параметризацией. Я создаю коллекцию кошек, добавляю кошку. Когда я пытаюсь вернуть кошку, Xcode показывает ошибку: «Свойство« имя »не найдено на объекте типа« id ». Это абсурд, потому что Cat имеет свойство name и MyCustomCollection не возвращает id, но ObjectType. Как объявить метод, чтобы автозаполнение могло понять, какой тип возвращается методом?Тип возвращаемого метода Objective-C с generics и автозаполнением Xcode

MyCustomCollection *collection = [[MyCustomCollection<Cat *> alloc] init]; 
[collection addCustomObject:[[Cat alloc] init]]; 
NSString *string = [collection customObjectAtIndex:0].name; // Property 'name' not found on object of type 'id' 

MyCustomCollection.h файл

@interface MyCustomCollection<ObjectType> : NSObject 
-(ObjectType)customObjectAtIndex:(NSUInteger)index; 
-(void)addCustomObject:(ObjectType)object; 
@end 

Cat.h файл

@interface Cat : NSObject 
@property (nonatomic, strong) NSString *name; 
@end 

ответ

2

Проблема заключается не в объявлении метода. Это объявление переменной collection. Вы должны сказать компилятору, какой тип объектов находятся в коллекции:

MyCustomCollection<Cat *> *collection = [[MyCustomCollection<Cat *> alloc] init]; 

В противном случае он не будет знать, какие объекты в collection ссылки на переменные и предполагается, что они имеют тип id (отсюда и ошибки).

Вы теоретически можете также отличить результат от customObjectAtIndex, но это, похоже, преследует цель использования дженериков.

Смежные вопросы