Есть ли способ добавить параметр общего типа в протокол?

Как и в Xcode 7, Objective-C введены параметры типичного типа для классов. Есть ли способ использовать дженерики с протоколами Objective C? Я не нашел очевидного способа сделать это, потому что эквивалент @interface MyClass<ObjectType> уже используется для протоколов (например, @protocol MyProtocol<NSObject>).

Пример: я хотел бы преобразовать код следующим образом:

@protocol MYObjectContainer
- (id)objectAtIndex:(NSUInteger)index;
@end

чтобы сделать следующий код:

@protocol MYObjectContainer
- (ObjectType)objectAtIndex:(NSUInteger)index;
@end

Это возможно с помощью обычных классов (см., например, NSArray).

Ответ 1

Если я правильно понимаю, что вы говорите, вы можете:

Укажите, что объект должен быть либо экземпляром, либо наследовать от ObjectType, используя:

@protocol MYObjectContainer
- (__kindof ObjectType *)objectAtIndex:(NSUInteger)index;
@end

Укажите, что элементы в коллекции (NSArray, NSSet и т.д.) должны быть экземпляром ItemType (префикс с '__kindof', чтобы также распространить его на объекты, наследуемые от ItemType), используя:

@protocol MYObjectContainer
- (CollectionType <ItemType *> *)objectAtIndex:(NSUInteger)index;
@end

Обратите внимание, что генераторы Objective-C предназначены для предотвращения скрытых ошибок, предоставляя предупреждения компилятора, когда указанный тип не соблюдается. Они не навязывают указанный тип во время выполнения.