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


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

и

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

5 53

5 ответов:

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

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

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

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

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

Edit:

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

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

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

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

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

посмотреть этой подробнее.

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

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

примером является объект appdelegate действует от имени appobject.

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

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

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

An яважно prerequisite понимает протоколы fпервый затем делегатов. Я рекомендую вам сначала увидеть этой краткий учебник, то вижу что такое протокол?. Кроме того, вы должны знать разницу между классом и протокола см. цель-C: класс против протокола и в чем смысл протоколов?.


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

delegate:1 для вас do что такое "делегат" - 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 или любой). Это глупо! Вы должны сказать ему: "Эй, чтобы вы работали, чтобы иметь определенные функциональные возможности, вам нужно соответствовать протоколу, который мы определили для вас. (мы не собираемся расширять какой-либо или id, поскольку это было бы глупо, (вместо этого) мы сделали очень явный ограниченный протокол "
в Objective-C это чистая ваниль id, так что вы сделать

 @property (weak) id<DownloaderProtocol>delegate;  

быстро* это немного легче сделать:

weak var delegate:DownloaderProtocol?

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


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

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

 id<myProtocol> *delegatingObject;

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

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

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