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

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

et,

Comment déclarer variables dans un protocol class ?

53
demandé sur MarmiK 2011-03-25 13:48:41

5 réponses

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

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

si vous l'indiquez dans votre code, toute classe qui "conforme" au protocole MyProtocol peut être utilisé dans la variable instanceofclassthatimimplementsmyprotocol . Cela signifie que le code qui utilise cette variable sait qu'il peut utiliser n'importe quelle méthode définie dans MyProtocol avec cette variable particulière, quelle que soit sa classe. C'est une excellente façon d'éviter le modèle de conception héréditaire, et évite l'assemblage serré.

délégués sont une utilisation de la caractéristique de langue des protocoles. Le "delegation design pattern est une façon de concevoir votre code pour utiliser des protocoles si nécessaire. Dans les Cocoa frameworks, le dessin délégué est utilisé pour spécifier une instance d'une classe qui est conforme à un protocole particulier. Ce protocole spécifie les méthodes que la classe delegate devrait mettre en œuvre pour effectuer des actions spécifiques à des événements donnés. La classe qui l'utilise le délégué sait que son délégué coformes au Protocole, de sorte qu'il sait qu'il peut appeler les méthodes mises en œuvre à des moments donnés. Ce modèle de conception est un excellent moyen de découpler les classes, car il rend vraiment facile d'échanger 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'il implémente les méthodes spécifiées dans le protocole)!

Les protocoles

et les délégués ne se limitent pas à L'objectif C et le développement de Mac / iOS, mais le langage Objectif-C et les cadres D'Apple font un usage intensif de cette fonctionnalité de langage impressionnant et le modèle de conception.

Edit:

voici un exemple. Dans le cadre de L'UIKit du Cocoa Touch, il existe un protocole UITextFieldDelegate . Ce protocole définit une série de méthodes que les classes qui sont des délégués d'une instance UITextField devraient mettre. En d'autres termes, si vous voulez 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éfini comme:

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

alors le compilateur donnera des avertissements si vous lui Assignez une classe qui n'implémente pas protocole. C'est vraiment utile. Vous devez déclarer qu'une classe met en œuvre un protocole, et en disant qu'elle le fait, vous faites savoir aux autres classes qu'elles peuvent interagir d'une manière particulière avec votre classe. Ainsi, si vous assignez une instance de MyTextFieldDelegateClass à la propriété delegate de UITextField , le UITextField 1519240920 "sait qu'il peut appeler certaines méthodes particulières (liées pour la saisie de texte, sélection, etc.) de votre MyTextFieldDelegateClass . Il le sait parce que MyTextFieldDelegateClass a déclaré qu'il mettra en œuvre le UITextFieldDelegate protocole.

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

75
répondu James Bedford 2017-09-19 15:52:22
Le protocole

est un ensemble de méthodes (facultatives ou obligatoires) qui seraient appliquées par la classe qui est conforme à ce protocole. Bien que, délégué est la référence à cette classe qui est conforme à ce protocole et adhérera à mettre en œuvre les méthodes définies dans le protocole.

regarder ce pour plus de détails.

21
répondu NSPratik 2017-12-17 08:11:04

délégation: agissant pour le compte d'un autre objet(dessin ou modèle en oops)

il s'agit d'un dessin dans lequel un objet appelé délégué agit au nom et à la demande d'un autre objet.À un moment donné dans l'exécution, il envoie un message à son délégué; le message lui dit 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 pour le compte d'appobject.

protocole permettant la Communication entre objets non liés par héritage

un protocole est une déclaration d'une interface programmatique dont les méthodes peuvent être implémentées par n'importe quelle classe.Les protocoles sont l'objectif c caractéristique de langue .Simplement une liste de méthodes que n'importe quelle classe peut mettre en œuvre.Pour utiliser ceci vous devez confirmer au protocole. exemple: uitable Viewdatasource protocol, dont les méthodes cellforRowAtIndexPath sont déclarées dans le Protocole,Mais que nous mettons en œuvre pour créer tableview.

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

13
répondu Suraj K Thomas 2015-02-17 10:07:11

Un je important p rerequisite est de comprendre les protocoles f première puis délégués. Je vous recommande d'abord de voir ce petit tutoriel, puis de voir Qu'est-ce qu'un protocole? . En outre, vous devez connaître la différence entre la classe et le protocole donc voir Objectif-C: Classe versus protocole et quoi est le point de Protocoles? .


protocol: n'est qu'un plan des fonctions à mettre en œuvre. Toute classe qui adopte ce schéma devra mettre en œuvre ces fonctions. (Ne pas confondre implémenter une fonction avec appeler une fonction)

delegate: 1 est pour vous aussi faire quel delegat- ing de la classe est en train de faire sans héritage par exemple

par exemple vous avez un viewController et vous voulez télécharger des images ou vous voulez obtenir la distance du client à un magasin, donc au lieu de le faire tout seul, vous avez juste un objet moyen qui le fait pour vous. Cet objet est connu en tant que délégué objet. Normalement vous feriez quelque chose comme 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 à un tableauviewdelegate

class ViewController : UIViewController , UITableViewDelegate{
//other code

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

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


delegate: 2 Mais cet objet (le délégué) est un simple objet vanillé (id ou N'importe quel autre). Elle est bête! Vous avez à dire: " Hé pour que vous travailliez pour avoir des fonctionnalités spécifiques, vous devez vous conformer au protocole que nous avons défini pour vous. (nous n'allons pas étendre tout ou id comme cela serait stupide, (à la place) Nous avons fait un protocole confiné très explicite "
"
dans objectif-C c'est une pure vanille id , donc vous faites

 @property (weak) id<DownloaderProtocol>delegate;  

Swift * il est plus facile de le faire :

weak var delegate:DownloaderProtocol?

Protocole vient à la rescousse...le délégué implémente (n'utilise pas) la fonction pour cependant qu'elle convienne aux besoins de votre classe délégante.


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

5
répondu Honey 2018-04-06 20:47:20

voyons la déclaration de délégué dans le programme

 id<myProtocol> *delegatingObject;

l'objet de délégation conserve une référence à l'autre objet et envoie un message à cet objet au moment approprié.

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 comme un délégué ou vous pouvez dire n'importe quelle personne (id) qui a un degré requis (protocole) peut travailler comme un enseignant (délégué).

4
répondu Venu Gopal Tewari 2016-02-20 16:53:53