Разница между протоколом и делегатами? - PullRequest
55 голосов
/ 25 марта 2011

В чем разница между protocol и delegate?

и

Как мы можем объявить variables в protocol class?

Ответы [ 6 ]

77 голосов
/ 25 марта 2011

Протокол, объявленный с помощью синтаксиса (@protocol в Objective-C), используется для объявления набора методов, которые класс «принимает» (объявляет, что будет использовать этот протокол). Это означает, что вы можете указать в своем коде, что «вам все равно, какой класс используется, если он реализует определенный протокол». Это можно сделать в Objective-C следующим образом:

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

Если вы заявите это в своем коде, тогда любой класс, который «соответствует» протоколу MyProtocol , может использоваться в переменной instanceOfClassThatImplementsMyProtocol . Это означает, что код, использующий эту переменную, знает, что он может использовать любые методы, определенные в MyProtocol с этой конкретной переменной, независимо от того, какой это класс. Это отличный способ избежать шаблона проектирования наследования и избежать жесткой связи.

Делегаты используют языковую функцию протоколов. Шаблон проектирования делегирования - это способ разработки вашего кода для использования протоколов там, где это необходимо. В структурах Какао шаблон проектирования делегата используется для указания экземпляра класса, который соответствует конкретному протоколу. Этот конкретный протокол определяет методы, которые класс делегата должен реализовывать для выполнения определенных действий при данных событиях. Класс, который использует делегата, знает, что его делегат соответствует протоколу, поэтому он знает, что он может вызывать реализованные методы в определенные моменты времени. Этот шаблон проектирования является отличным способом разъединения классов, потому что он действительно облегчает обмен одного экземпляра делегата на другой - все, что должен сделать программист, это убедиться, что заменяющий экземпляр или класс соответствует необходимому протоколу (т.е. он реализует методы, указанные в протоколе)!

Протоколы и делегаты не ограничиваются только разработкой Objective-C и Mac / iOS, но язык Objective-C и фреймворки Apple интенсивно используют эту замечательную языковую функцию и шаблон проектирования.

Edit:

Вот пример. В структуре UIKit Cocoa Touch существует протокол UITextFieldDelegate . Этот протокол определяет серию методов, которые должны реализовывать классы, являющиеся делегатами экземпляра UITextField . Другими словами, если вы хотите назначить делегата для UITextField (используя свойство delegate), вам лучше убедиться, что этот класс соответствует UITextFieldDelegate . Фактически, поскольку свойство делегата UITextField определяется как:

@property(nonatomic, weak) id<UITextFieldDelegate> delegate

Тогда компилятор выдаст предупреждения, если вы назначите ему класс, который не реализует протокол. Это действительно полезно. Вы должны заявить, что класс реализует протокол, и, говоря, что он это делает, вы даете знать другим классам, что они могут определенным образом взаимодействовать с вашим классом. Таким образом, если вы присваиваете экземпляр MyTextFieldDelegateClass свойству delegate UITextField , UITextField знает , что он может вызвать некоторые конкретные методы (связанные с вводом текста, выделением и т. д.) вашего MyTextFieldDelegateClass . Он знает это, потому что MyTextFieldDelegateClass заявил, что будет реализовывать протокол UITextFieldDelegate .

В конечном итоге все это приводит к гораздо большей гибкости и адаптируемости кода вашего проекта, что, я уверен, вы скоро поймете после использования этой технологии! :)

24 голосов
/ 05 марта 2015

Протокол - это набор методов (необязательных или обязательных), которые будут реализованы классом, соответствующим этому протоколу. В то время как делегат является ссылкой на этот класс, который соответствует этому протоколу и будет придерживаться методов, определенных в протоколе.

Посмотрите на это для более подробной информации.

13 голосов
/ 17 февраля 2015

Делегирование: действие от имени другого объекта (шаблон проектирования в упс)

Это шаблон проектирования , в котором объект, вызываемый делегатом, действует от имени и по запросу другого объекта. В какой-то момент выполнения он отправляет сообщение своему делегату; сообщение сообщает делегату, что какое-то событие должно произойти, и запрашивает ответ. Делегат реализует метод, вызванный сообщением, и возвращает соответствующее значение

Например, объект appdelegate действует от имени appobject.

Протокол: включение связи между объектами, не связанными с наследованием

Протокол - это объявление программного интерфейса, методы которого может реализовать любой класс. Протоколы являются объективными c языковая особенность . Проще говоря, список методов, которые может реализовать любой класс. Чтобы использовать это, необходимо подтвердить к протоколу. Примером является протокол UITableviewDatasource, методы которого cellforRowAtIndexPath объявлены в протоколе, но мы реализуем его для создания табличного представления.

См. https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/StreamlineYourAppswithDesignPatterns/StreamlineYourApps/StreamlineYourApps.html

6 голосов
/ 12 сентября 2016

Необходимым i mportant p является понимание протоколов f irst затем делегатов. Я рекомендую вам сначала посмотреть этот краткий учебник, а затем Что такое протокол? . Кроме того, вы ДОЛЖНЫ знать разницу между классом и протоколом, поэтому смотрите Objective-C: класс против протокола и В чем смысл протоколов? .


protocol: является ТОЛЬКО проектом функций, которые необходимо реализовать. Любой класс, который принимает этот план, должен будет реализовать эти функции. (НЕ путайте реализацию функции с вызовом функции)

delegate: 1 также для вас делать что делает делегат- ing класс без наследование например

Например, у вас есть viewController и вы хотите загружать изображения, или вы хотите получить расстояние от магазина до покупателя, поэтому вместо того, чтобы делать все самостоятельно, у вас просто есть средний объект, который делает это за вас. Этот объект известен как объект делегата. Обычно вы делаете что-то подобное:

class ViewController : UIViewController , DownloaderDelegate{
//other code

// inside viewDidLoad or elsewhere you write:
downloaderHandler.delegate = self // now self can also use whatever the delegating object gives it...previously it was only a viewController but now it's 'almost' also a downloader

очень похоже на то, что вы делаете для соответствия tableViewDelegate

class ViewController : UIViewController , UITableViewDelegate{
//other code

// inside viewDidLoad or elsewhere you write
tableView.delegate = self 

ваш self теперь также может выполнять связанные с tableView вещи.


delegate: 2 Но этот объект (делегат) является простым ванильным объектом (id или Any). Это глупо! Вы должны сказать это: «Привет, чтобы вы работали, чтобы иметь определенные функциональные возможности, которые вам нужны, чтобы соответствовать протоколу, который мы для вас определили (мы не собираемся расширять Any или id, поскольку это будет глупо, (вместо этого) мы сделали очень явный ограниченный протокол "
в Objective-C это чистый ваниль id, так что вы делаете

 @property (weak) id<DownloaderProtocol>delegate;  

в Swift * это немного проще сделать:

weak var delegate:DownloaderProtocol?

Протокол приходит на помощь ... делегат реализует (не использует) функцию, однако она соответствует потребностям вашего делегирующего класса.


*: в Swift у вас нет id, но вам не нужен его эквивалент Any, потому что в протоколах Swift также есть тип гражданина первого класса

4 голосов
/ 20 февраля 2016

Давайте посмотрим декларацию делегата в программе

 id<myProtocol> *delegatingObject;

DelegatingObject сохраняет ссылку на другой объект и в соответствующее время отправляет сообщение этому объекту.

Протокол - это группа связанных свойств и методов, которые могут быть реализованы любым классом.

Это означает, что любой объект (тип идентификатора), который подтверждает myProtocol (группу связанных свойств и методов), может работать как делегат, или вы можете сказать, что любой человек (id), имеющий необходимую степень (протокол), может работать в качестве учителя (делегат).

1 голос
/ 05 декабря 2018

Мы можем сказать Протокол как набор правил. Эти правила могут быть необязательными или обязательными, как мы должны использовать в протоколе.

Делегаты - это техника передачи сообщений в задаче C и swift. Об этом сообщении должен заботиться объект.

Пример: Простым примером, к которому привык каждый разработчик iOS, является UITableview, При создании таблицы вы должны реализовать cellForRowAtIndexPath() и numberOfRowsInSection() в своем контроллере, чтобы правила (протокол) определялись в классе UItableview, как требуется, это обязательный протокол .

Существует другой протокол, такой как heightForRowAtIndexPath(), который является необязательным.

Теперь переходим к Делегат В UITableView есть метод (message) didSelectRowAtIndexPath(), который отправляет вам сообщение о событии. Если вы устанавливаете делегата в self, это означает, что ваш контроллер готов принять заботиться об этом событии.

Этот термин кажется более запутанным для разработчиков, потому что мы привыкли использовать его вместе (:

Наслаждайтесь !!!!

...