Может ли категория реализовать протокол в Objective C?

88

У меня есть категория на NSDate, и было бы удобно, если бы она могла реализовать ранее созданный мной протокол. Это возможно? какой для этого правильный синтаксис?

cfischer
источник

Ответы:

144

Да, это возможно. Синтаксис:

@interface NSDate (CategoryName) <ProtocolName>
@end

@implementation NSDate (CategoryName)
@end

Вот документация Apple по этой теме.

Это также можно сделать с помощью расширения класса. Мне очень нравится, что это конфиденциально соответствует протоколам делегирования. Это скрывает детали реализации того, что является делегатом некоторого класса из общедоступного интерфейса, и удаляет зависимость из заголовка.

Николай Рухе
источник
Жаль, что нет способа переместить объявление протокола в реализацию категории класса.
adib
@adib Вот для чего нужны расширения классов.
Николай Рухе
@ bikram990 Документ удален и теперь находится в устаревшем разделе. Обновил ссылку.
Николай Рухе
к сожалению, мы не можем объявлять переменные экземпляра в категориях, которые могут нам понадобиться для некоторых реализаций протокола делегирования
yasirmturk
@yasirmturk Вы могли бы сделать это с помощью objc_setAssociatedObject :)
animaonline