2011-03-25 3 views

Répondre

74

Un protocole, déclaré avec la syntaxe (@protocol dans Objective-C) est utilisé pour déclarer un ensemble de méthodes qu'une classe "adopte" (déclare qu'elle utilisera ce protocole) sera implémentée. 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 se faire en Objective-C comme suit:

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

Si vous indiquez dans votre code, toute classe qui est « conforme » au protocole MyProtocol peut être utilisé dans la variable instanceOfClassThatImplementsMyProtocol . Cela signifie que le code qui utilise cette variable sait qu'il peut utiliser toutes 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 d'héritage, et évite un couplage serré. Les délégués sont une utilisation de la fonctionnalité de langage des protocoles. Le delegation design pattern est un moyen de concevoir votre code pour utiliser des protocoles si nécessaire. Dans les frameworks Cocoa, le modèle de conception de délégué est utilisé pour spécifier une instance d'une classe qui se 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 sur des événements donnés. La classe qui utilise le délégué sait que son délégué coforme au protocole, donc il sait qu'il 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 est très facile d'échanger une instance de délégué pour une autre. Tout ce que le programmeur doit faire est de s'assurer que l'instance ou la classe de remplacement se conforme au protocole nécessaire. méthodes spécifiées dans le protocole)! Les protocoles et les délégués ne se limitent pas au développement Objective-C et Mac/iOS, mais le langage Objective-C et les frameworks Apple font un usage intensif de cette caractéristique géniale et de ce design.

Edit:

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 qui sont des délégués 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 devez vous assurer que cette classe est conforme à UITextFieldDelegate. En fait, parce que la propriété de délégué de UITextField est défini comme:

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

Ensuite, le compilateur donnera des avertissements si vous attribuez une classe à ce qui ne met pas en œuvre le protocole. C'est vraiment utile. Vous devez indiquer 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 certaine manière avec votre classe.Donc, si vous attribuez une instance de MyTextFieldDelegateClass à la propriété delegate de UITextField, le UITextFieldsait qu'il peut appeler des méthodes particulières (liées au texte entrée, sélection, etc.) de votre MyTextFieldDelegateClass. Il le sait parce que MyTextFieldDelegateClass a dit qu'il implémenterait le protocole UITextFieldDelegate. En fin de compte, tout ceci mène à une plus grande flexibilité et adaptabilité dans le code de votre projet, ce que vous réaliserez bientôt après avoir utilisé cette technologie! :)

+3

Alors protocoles est ce que vous faites et délègue la manière pour le faire? – 3lvis

+13

Je ne sais pas si je vous suis tout à fait. La délégation est un modèle de conception qui permet à une classe de prendre des responsabilités d'une autre manière de manière à découper le code (très bon, chose flexible). Les protocoles sont une fonctionnalité de langage Objective-C qui vous permet d'écrire et d'utiliser du code qui utilise le concept de délégation. –

+0

@ JamesBedford pouvez-vous me dire quelle est la signification de "id " – Exploring

13

Délégation: Agissant au nom d'un autre objet (modèle Design oups)

Il est un modèle de conception dans lequel un objet appelé le délégué agit au nom de et à la demande de , un autre objet.A un certain point dans 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 qui agit au nom de appobject.

Protocole: Activation de la communication entre les objets non liés par héritage

Un protocole est une déclaration d'une interface de programmation dont les méthodes ne importe quelle classe peut implement.Protocols sont objectives c caractéristique de la langue .Simply parler une liste des méthodes que toute classe peut implémenter.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.

référer https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/StreamlineYourAppswithDesignPatterns/StreamlineYourApps/StreamlineYourApps.html

12
Protocole

est un ensemble de méthodes (soit optionnel ou ceux) serait mise en oeuvre par la classe qui est conforme à ce protocole. Alors que délégué est la référence à cette classe qui est conforme à ce protocole et adhérera à implémenter les méthodes définies dans le protocole. Pour plus de détails, consultez la section this pour plus de détails.

+1

meilleure explication que j'ai jamais vu, merci. –

+0

S'il vous plaît upvote la réponse dans ce cas .. – NSPratik

+1

ne vous inquiétez pas, je l'ai fait. –

4

Voyons voir 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 opportun envoie un message à cet objet.

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

Cela implique que tout objet (type d'ID) qui confirme myProtocol (groupe de propriétés et méthodes associées) peut fonctionner en tant que délégué ou vous pouvez dire que toute personne (ID) ayant un degré requis (protocole) peut travailler en tant que Enseignant (délégué).

4

Un i mportant p rerequisite est protocoles compréhension f IRST puis délégués. Je vous recommande d'abord voir tutoriel court this, puis voir What is a Protocol?. De plus, vous DEVEZ connaître la différence entre la classe et le protocole, voir Objective-C: Class versus Protocol et What is the point of Protocols?.


protocol: est seulement un plan de fonctions pour mettre en œuvre. Toute classe qui adopte ce plan devra mettre en œuvre ces fonctions. (Ne confondez pas la mise en œuvre une fonction avec fonction appellent)

delegate: est pour vous aussi faire quelle classe déléguant les ing fait sanshé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 comme l'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 do WHATEVER the delegate can do...previously it was only a viewController but now it's 'almost' also a downloader 

très semblable à 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 maintenant faire aussi des choses liées tableView.


delegate: Mais cet objet (le délégué) est un objet de vanilles (id ou Tout). C'est idiot! Vous devez le dire: "Hey pour vous de travailler 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 Any ou id car cela serait stupide, (à la place) nous avons fait un protocole confiné très explicite "
en Objective-C, il est une vanille pure id, de sorte que vous faites

@property (weak) id<DownloaderProtocol>delegate; 

à Swift * il est vous un peu plus facile faire:

weak var delegate:DownloaderProtocol? 
Protocole

vient sauvetage ... le de legate implémente (n'utilise pas) la fonction pour qu'elle corresponde aux besoins de votre classe délégante.


*: Swift vous n'avez pas id encore vous n'avez pas besoin il est équivalent Any parce que dans les protocoles Swift sont également un premier type de citoyen de classe

Questions connexes