web-dev-qa-db-fra.com

Différence entre le protocole et les délégués?

Quelle est la différence entre un protocol et un delegate?

et,

Comment pouvons-nous déclarer variables dans un protocol class?

55
er.mobileapp

Un protocole, déclaré avec la syntaxe (@protocol En Objective-C) est utilisé pour déclarer un ensemble de méthodes qu'une classe "adopte" (déclare qu'elle utilisera ce protocole) implémentera. Cela signifie que vous pouvez spécifier dans votre code que "vous ne vous souciez pas de la classe utilisée tant qu'elle implémente un protocole particulier". Cela peut être fait dans Objective-C comme suit:

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

Si vous le déclarez dans votre code, toute classe "conforme" au protocole MyProtocol peut être utilisée dans la variable instanceOfClassThatImplementsMyProtocol. Cela signifie que le code qui utilise cette variable sait qu'il peut utiliser les méthodes définies dans MyProtocol avec cette variable particulière, quelle que soit sa classe. C'est un excellent moyen d'éviter le modèle de conception de l'héritage et évite un couplage serré.

Les délégués sont une utilisation de la fonction linguistique des protocoles. Le modèle de conception de délégation est un moyen de concevoir votre code pour utiliser des protocoles si nécessaire. Dans les frameworks Cocoa, le modèle de conception délégué est utilisé pour spécifier une instance d'une classe conforme à un protocole particulier. Ce protocole particulier spécifie les méthodes que la classe déléguée doit implémenter pour effectuer des actions spécifiques lors d'événements donnés. La classe qui utilise le délégué sait que son délégué coforme au protocole, elle sait donc qu'elle peut appeler les méthodes implémentées à des moments donnés. Ce modèle de conception est un excellent moyen de découpler les classes, car il facilite vraiment l'échange d'une instance déléguée contre une autre - tout ce que le programmeur doit faire est de s'assurer que l'instance ou la classe de remplacement est conforme au protocole nécessaire (c'est-à-dire qu'elle implémente la méthodes spécifiées dans le protocole)!

Les protocoles et les délégués ne sont pas limités uniquement au développement d'Objective-C et Mac/iOS, mais le langage Objective-C et les frameworks Apple font un usage intensif de cette fonctionnalité de langage et modèle de conception impressionnants.

Modifier:

Voici un exemple. Dans le cadre UIKit de Cocoa Touch, il existe un protocole UITextFieldDelegate. Ce protocole définit une série de méthodes que les classes déléguées d'une instance UITextField doivent implémenter. En d'autres termes, si vous souhaitez affecter un délégué à un UITextField (en utilisant la propriété delegate), vous feriez mieux de vous assurer que cette classe est conforme à UITextFieldDelegate. En fait, parce que la propriété déléguée de UITextField est définie comme:

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

Ensuite, le compilateur donnera des avertissements si vous lui affectez une classe qui n'implémente pas le protocole. C'est vraiment utile. Vous devez déclarer qu'une classe implémente un protocole, et en disant que c'est le cas, vous faites savoir aux autres classes qu'elles peuvent interagir d'une manière particulière avec votre classe. Donc, si vous affectez une instance de MyTextFieldDelegateClass à la propriété delegate de UITextField, le UITextField sait qu'il peut appeler certaines méthodes particulières (liées à la saisie de texte, à la sélection, etc.) de votre MyTextFieldDelegateClass. Il le sait car MyTextFieldDelegateClass a dit qu'il implémenterait le protocole UITextFieldDelegate.

En fin de compte, tout cela conduit à une flexibilité et une adaptabilité beaucoup plus grandes dans le code de votre projet, que je suis sûr que vous réaliserez bientôt après avoir utilisé cette technologie! :)

78
James Bedford

Le protocole est un ensemble de méthodes (facultatives ou obligatoires) qui seraient implémentées par la classe conforme à ce protocole. Tandis que délégué est la référence à cette classe qui est conforme à ce protocole et adhèrera à l'implémentation des méthodes définies dans le protocole.

Jetez un œil à this Apple doc pour plus de détails.

25
NSPratik

Délégation: agir au nom d'un autre objet (Design pattern in oops)

Il s'agit d'un modèle de conception dans lequel un objet appelé le délégué agit au nom et à la demande d'un autre objet. À un certain moment de l'exécution, il envoie un message à son délégué; le message indique au délégué qu'un événement est sur le point de se produire et demande une réponse. Le délégué implémente la méthode invoquée par le message et renvoie une valeur appropriée

Un exemple est l'objet appdelegate agit au nom de appobject.

Protocole: activation de la communication entre des objets non liés par héritage

Un protocole est une déclaration d'une interface de programmation dont les méthodes peuvent être implémentées par n'importe quelle classe. Les protocoles sont une fonctionnalité de langage Objective C . En termes simples, une liste de méthodes que toute classe peut Pour l'utiliser, vous devez confirmer le protocole. l'exemple est le protocole UITableviewDatasource, dont les méthodes cellforRowAtIndexPath sont déclarées dans le protocole, mais nous l'implémentons pour créer la tableview.

Reportez-vous https://developer.Apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/StreamlineYourAppswithDesignPatterns/StreamlineYourApps/StreamlineYourApps.html

13
Suraj K Thomas

Un i mportant p condition préalable est la compréhension des protocoles f irst alors délégués. Je vous recommande de voir d'abord ce petit tutoriel, puis de voir Qu'est-ce qu'un protocole? . De plus, vous DEVEZ connaître la différence entre la classe et le protocole, voir donc Objective-C: classe versus protocole et Quel est l'intérêt des protocoles? .


protocol: est UNIQUEMENT un plan de fonctions à implémenter. Toute classe qui adopte ce plan devra implémenter ces fonctions. (Ne confondez PAS implémentation une fonction avec appel une fonction)

delegate:1 est pour vous aussi faire ce qu'un délégué - ing la classe fait sans héritage par exemple.

Par exemple, vous avez un viewController et vous souhaitez télécharger des images ou vous voulez obtenir la distance du client dans un magasin, donc au lieu de tout faire par vous-même, vous avez juste un objet moyen qui le fait pour vous. Cet objet est appelé objet délégué. Normalement, vous feriez quelque chose en tant que tel:

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

très similaire à ce que vous faites pour se conformer à une tableViewDelegate

class ViewController : UIViewController , UITableViewDelegate{
//other code

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

votre self peut désormais aussi faire des choses liées à tableView.


delegate:2 Mais cet objet (le délégué) est un simple objet Vanilla (id ou Any). C'est idiot! Vous devez lui dire: "Hé pour que vous travailliez pour avoir des fonctionnalités spécifiques dont vous avez besoin pour vous conformer au protocole que nous avons défini pour vous (nous n'allons pas étendre Any ou id car cela serait stupide, (à la place ) nous avons fait un protocole confiné très explicite "
dans Objective-C, c'est une pure vanille id, donc vous faites

 @property (weak) id<DownloaderProtocol>delegate;  

à Swift* c'est un peu plus simple:

weak var delegate:DownloaderProtocol?

Le protocole vient à la rescousse ... le délégué implémente (n'utilise pas) la fonction mais elle convient aux besoins de votre classe délégante.


*: Dans Swift vous n'avez pas id vous n'avez toujours pas besoin de son équivalent Any car dans Swift les protocoles sont également un type de citoyen de première classe

6
Honey

Voyons la déclaration du délégué dans le programme

 id<myProtocol> *delegatingObject;

Le delegatingObject conserve une référence à l'autre objet et, au moment approprié, envoie un message à cet objet.

Un protocole est un groupe de propriétés et de méthodes connexes qui peuvent être implémentées par n'importe quelle classe.

Cela implique que tout objet (type id) qui confirme myProtocol (groupe de propriétés et méthodes connexes) peut fonctionner en tant que délégué ou vous pouvez dire que toute personne (id) qui a un diplôme requis (protocole) peut travailler en tant que professeur (délégué) .

4
Venu Gopal Tewari

Nous pouvons dire Protocol comme un ensemble de règles. Ces règles peuvent être facultatives ou obligatoires comme nous devons les utiliser dans le protocole.

Délégués est une technique de transmission de messages en Objective C et Swift. Un objet doit prendre soin de ce message.

Ex: Un exemple simple utilisé par tous les développeurs iOS est UITableview. Lors de la création d'une table, vous devez implémenter cellForRowAtIndexPath() et numberOfRowsInSection() dans votre contrôleur, qui régit ( protocole) sont définis dans la classe UItableview comme requis, c'est un nécessite Protocol.

Il existe d'autres protocoles comme heightForRowAtIndexPath() qui est facultatif.

Maintenant vient à Délégué dans UITableView il y a une méthode (message) didSelectRowAtIndexPath() qui vous envoie un message d'un événement. Si vous définissez le délégué sur self, cela signifie que votre contrôleur est prêt pour prendre soin de cet événement.

Ces termes semblent être plus déroutants pour les développeurs car nous avons l'habitude de les utiliser ensemble (:

Prendre plaisir!!!!

2
guru