В Objective-C вы объявляете переменную типа протокола, объявляя ее как id<SomeProtocol>
, например:
@protocol SomeProtocol<NSObject>
...
@end
@interface SomeClass : NSObject<SomeProtocol> // base class NSObject, implements SomeProtocol
...
@end
@implementation SomeClass
...
@end
// a variable declaration somewhere which holds a reference to any object
// which implements SomeProtocol
id<SomeProtocol> anyObjectImplementingSomeProtocol = SomeClass.new;
Используя облегченные обобщенные значения Objective-C , вы можете расширить это доконтейнеры типа протокола, например:
NSMutableArray<id<SomeProtocol>> someArray = NSMutableArray.new;
Предупреждение: Облегченные обобщенные имена названы так, что по какой-то причине довольно легко обойти введенные ими ограничения, например, путем добавления объектакоторый не реализует SomeProtocol
до someArray
. Вы не получаете такие же сильные дженерики, как в Swift.
HTH