Подтвердить что ты не робот

Разница между протоколом и делегатами?

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

и

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

4b9b3361

Ответ 1

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

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

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

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

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

Изменить:

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Пример: объект appdelegate действует от имени appobject.

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

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

Обратитесь https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/StreamlineYourAppswithDesignPatterns/StreamlineYourApps/StreamlineYourApps.html

Ответ 4

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


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

delegate: 1 также позволяет делать то, что делает delegat-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 '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 протоколы также относятся к типу граждан первого класса.

Ответ 5

Посмотрите объявление делегата в программе

 id<myProtocol> *delegatingObject;

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

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

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

Ответ 6

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

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

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

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

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

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

Наслаждаться!!!!

Ответ 7

Protocol предоставляет набор деклараций. Который может реализовать любой другой класс.

Delegates - это технология передачи сообщений в Objective C и Swift. Передача данных или отправка информации одному объекту другому объекту с помощью делегата.