Ответ 1
Да, есть разница: (EDIT: или, по крайней мере, в исходной версии этого q, который не добавил extension UIView : Draggable {}
в конец опции 1).
-
Вариант 1 создает реализацию по умолчанию для экземпляров
UIView
, которые соответствуютDraggable
. Вам по-прежнему нужно отметитьUIView
, который вы хотите соответствоватьDraggable
как таковой в объявлении:class MyView : Draggable
. Все, что соответствуетDraggable
, но не является подклассомUIView
, должно будет предоставить свою собственную реализацию. -
Вариант 2 расширяет все
UIView
, чтобы они соответствовалиDraggable
. Ничто другое не может бытьDraggable
, если для этих классов не записаны отдельные расширения, или они соответствуют протоколу вручную. В объявлении класса нет необходимости добавлятьDraggable
.
Расширение протокола обычно является лучшим вариантом. В этом случае это, очевидно, верно, так как не все UIView
могут быть Draggable
. Кроме того, переход по маршруту расширения протокола означает, что вы можете создать объект Draggable
, который не является подклассом UIView
, если это необходимо (по общему признанию, маловероятно, так как большинство элементов управления Cocoa являются подклассами UIView
- хотя и не все - UIBarButtonItem
не странно)
Если вы выполните опцию 2, во многих случаях вы добавите ненужные методы в UIView
, что является нарушением хорошего объектно-ориентированного дизайна - в частности, принципа разделения сегментов (клиенты не должны вынуждены полагаться на методы они не используют
), который является "I" в SOLID принципах