Во-первых, протокольные методы не являются особыми. Они, как и любой другой метод Objective-C, вызывается сообщением, отправленным объекту. В этой части ничего особенного нет. Протоколы в основном являются лишь намеком на компилятор, хотя вы можете запросить, соответствует ли объект одному во время выполнения, и принимать решения на основе этого.
Вы можете проверить это, выполнив метод протокола (или весь протокол), не объявив об этом факте в интерфейсе классов, и вызовите функцию в экземпляре этого объекта после того, как он был лишен id<YourProtocol>
, и он будет работать ,
Вы можно (и иногда нужно) называть NSCoding
Методы себя - вы можете решить, что вы хотите сохранения объектов на диске, и что это лучший способ сделать это.
NSCoding
на самом деле является прекрасным примером того, почему протоколы по-прежнему полезны, даже если они не обеспечивают реализацию - осуществление initWithCoder:
и encodeWithCoder:
будет отличаться для каждого класса, который реализует их - нет никакого смысла в предоставлении реализация.
Основываясь на этом, считайте datasource
собственностью UICollectionView
; поскольку в Objective-C нет множественного наследования, было бы нежелательным, чтобы источник данных был самим классом, поскольку это помешало бы вам использовать UIViewController
в качестве источника данных и заставить вас создать совершенно новый класс для этого выражения цель.
Protocols can also be used to implement multiple inheritance in a type safe way without redeclaring the interface of the giver in the inheritor. Если весь интерфейс унаследованного класса является протоколом, то наследник может просто соответствовать этому протоколу.
Objective-C предоставляет миксины в виде категорий, которые могут реализовывать протоколы существующих классов.
Для полной защиты протоколов (в Swift) см. Раздел «Протокольное ориентированное программирование WWWDC 2015».
Спасибо. Поэтому мой вопрос касается конкретной информации о том, как сами методы протокола называются/вызывается. Часть, о которой вы заявили, «... вызов метода в конечном счете поступает на ваш encodeWithCoder или initWithCoder». Аналогично другим методам протокола. – swiftlee
Обновлен ответ на пример, надеюсь, что это поможет. Хотя протоколы и делегаты тесно связаны, не требуется, чтобы каждый класс, принимающий протокол, имел делегата. Все, что мы говорим, приняв протокол, заключается в том, что мы соглашаемся реализовать методы, определенные в протоколе. – TheAppMentor