2015-11-27 5 views
0

Я пытаюсь понять реализацию протоколов высокого уровня без делегатов в рамках Apple. Когда subClass соответствует и реализует метод протокола, как называется этот метод? Давайте рассмотрим методы протокола NSCoder (например, encodeWithCoder: и initWithCoder :).Как методы протокола в iOS автоматически вызывают?

Без делегатов вы могли бы предоставить какие-либо примеры использования протоколов (кроме достижения полиморфизма?) Я вижу, что некоторые методы могут быть абстрагированы от базовых классов и сгруппированы в интерфейсы, но без какой-либо реализации (например, как mixins), что является существенным использованием?

ответ

0

Взяв пример протокола NSCoding, два необходимых метода в протоколе, в основном реализуют шаги, которые должен выполнить объект для кодирования для архивирования. Он также реализует initWithCoder для воссоздания объекта из архив

Допустим, вы создали пользовательский объект, только ваш объект знает, какие свойства ему нужно архивировать.

Когда вы вызываете метод для архивирования своего пользовательского объекта, вызов метода в конечном итоге поступает в ваш encodeWithCoder или initWithCoder для принятия конкретных действий для вашего класса.

***** Обновлено ****

Глядя на это на примере: Допустим, наша структура данных выглядит следующим образом

SomeArray = [String, CustomObject, aDictionary]

Когда мы хотим архивировать someArray, мы вызываем на него метод archiveRootObject. Теперь для того, чтобы someArray архивировал себя, ему нужны все содержащиеся в нем элементы, чтобы самостоятельно архивировать архив. Массив просто инструктирует подпункты самому архивировать, вызывая для них метод encodeWithCoder.

Приняв и соблюдая протокол NSCoding, вы просто подтверждаете корневой массив, что Да, я знаю, как архивировать и разблокировать себя.

Надеюсь, это поможет.

+0

Спасибо. Поэтому мой вопрос касается конкретной информации о том, как сами методы протокола называются/вызывается. Часть, о которой вы заявили, «... вызов метода в конечном счете поступает на ваш encodeWithCoder или initWithCoder». Аналогично другим методам протокола. – swiftlee

+0

Обновлен ответ на пример, надеюсь, что это поможет. Хотя протоколы и делегаты тесно связаны, не требуется, чтобы каждый класс, принимающий протокол, имел делегата. Все, что мы говорим, приняв протокол, заключается в том, что мы соглашаемся реализовать методы, определенные в протоколе. – TheAppMentor

3

Во-первых, протокольные методы не являются особыми. Они, как и любой другой метод 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».

+0

Вы можете преобразовать символ протокола в объект протокола с помощью использования @protocol(). Кроме того, после этого вы можете проверить, что что-то 'соответствуетToProtocol: protocol_object'. Я думаю, что это основное различие между протоколами и «нормальными» объектами – gaussblurinc

+0

Как я уже сказал в своем ответе, «вы можете запросить, соответствует ли объект протоколу во время выполнения». Мое утверждение о том, что они не являются особенными, - это сказать, что их методы не являются особенными. –

+0

Вы правы, я неправильно понял ваш ответ. – gaussblurinc

Смежные вопросы