Протоколы похожи на интерфейсы в Java. Итак, класс предоставляет протокол для доступа к нему.
Вы можете «подклассировать» протоколы так же, как в Java вы можете «подклассить» интерфейсы.
С другой стороны, категории - это способ добавить больше методов в класс. Ограничение: нельзя добавлять переменные экземпляра с категорией. Вы можете получить доступ только к существующим переменным экземпляра.
Это очень полезно, поскольку позволяет избежать создания большой хрупкой иерархии подклассов.
Итак, суть в том, что если вы хотите, чтобы различные классы представления соответствовали стандартному интерфейсу, то используйте протокол. Если вы хотите добавить несколько методов в существующий класс без необходимости создавать подклассы, перейдите к категории.
Однако следует иметь в виду, что когда вы добавляете методы в категорию - что мне напомнили коллеги по работе - вы делаете эти методы доступными повсюду. В нескольких местах я читал, что распространенная ошибка новичка - сходить с ума с категориями, используя их все время вместо того, чтобы создавать новые классы, которые будут выполнять эту работу.
Итак, если новый метод категории, который вы рассматриваете, действительно специфичен или скорее - тесно связан - с бизнес-функцией, то, вероятно, он не должен быть категорией. Они действительно должны использоваться только для общих дополнений к базовому классу.