Чем протокол в Obj-C отличается от протокола в Swift?
Протокол в Objective-C
Список селекторов, которые класс обещает реализовать. Секции @required (по умолчанию) и @optional; наличие опционального метода проверяют в рантайме через respondsToSelector: перед каждым вызовом — иначе unrecognized selector. Протоколы могут наследовать друг от друга (@protocol Foo <NSObject>), типизируют переменные id<Foo>, но:
- применимы только к классам (и к
id); - не могут содержать реализацию — никаких default implementations;
- нет associated types и generic-ограничений;
- соответствие проверяется формально при компиляции, но в рантайме можно
conformsToProtocol:и даже добавить протокол к классу (class_addProtocol).
#import <Foundation/Foundation.h>
@protocol Downloadable <NSObject>
- (NSURL *)downloadURL;
@optional
- (NSInteger)priority;
@end
static NSInteger priorityOf(id<Downloadable> item) {
if ([item respondsToSelector:@selector(priority)]) {
return [item priority];
}
return 0;
}
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep