web-dev-qa-db-fra.com

Quels sont exactement les protocoles et les délégués et comment sont-ils utilisés dans IOS?

Je suis vraiment confus au sujet du concept de délégués et de protocoles. Sont-ils équivalents aux interfaces et aux classes d'adaptateurs en Java? Comment travaillent-ils? Aucune des ressources que j'ai lues n'a été utile jusqu'à présent. "La délégation est un modèle simple et puissant dans lequel un objet d'un programme agit au nom d'un autre objet ou en coordination avec lui. L'objet délégué conserve une référence à l'autre objet, le délégué, et, au moment approprié, envoie un message. à elle. " Je n'ai aucune idée de ce que cela signifie. Quelqu'un peut-il expliquer de quoi il s'agit et donner un exemple simple? Merci d'avance!

ÉDITER:

Pour autant que je comprends maintenant,

1) les délégués implémentent des protocoles (un autre nom pour les interfaces)

2) l'objet enregistre un délégué (qui implémente un protocole)

3) l'objet peut appeler des méthodes de protocole sur le délégué

Par conséquent, un délégué connecte l'objet au protocole.

Corrigez-moi si j'ai tort, s'il-vous plait.

Je ne comprends toujours pas pourquoi l'objet lui-même ne peut pas implémenter un protocole? Cela aurait pu être tellement plus facile!

20
Oleksiy

Les protocoles sont un moyen de spécifier un ensemble de méthodes que vous souhaitez qu'une classe implémente si elle veut travailler avec l'une de vos classes. Les délégués et les sources de données comme UITableViewDelegate et UITableViewDataSource sont en effet des protocoles.

Vous spécifiez un protocole de cette façon:

@protocol MyProtocol <NSObject>

- (void)aRequiredMethod;

@required
- (void)anotherRequiredMethod;

@optional
- (void)anOptionalMethod;

@end

Les méthodes déclarées après le @required ou avant tout autre spécificateur sont requises et les classes qui souhaitent utiliser votre protocole doivent toutes les implémenter. Vous pouvez également déclarer certaines méthodes facultatives en les déclarant après le spécificateur @optional.

Vous pouvez alors spécifier qu'une classe "se conforme" à un protocole (implémente les méthodes requises) dans l'interface de la classe:

@interface MyClass <MyProtocol>

@end

Vous conservez généralement une référence à un objet conforme à un protocole à l'aide d'une propriété. Par exemple, pour suivre un délégué:

@property (nonatomic, weak) id<MyProtocol> delegate;

À ce stade, dans votre code, il vous suffit d'appeler la méthode que vous souhaitez appeler sur l'objet dont vous gardez la référence et qui implémente votre protocole comme vous le feriez avec n'importe quelle autre méthode:

[self.delegate aRequiredMethod];

Pour vérifier si un objet est conforme à un protocole, vous pouvez appeler

[self.delegate conformsToProtocol:@protocol(MyProtocol)]

Pour vérifier si un objet implémente une méthode que vous pouvez appeler

[self.delegate respondsToSelector:@selector(anOptionalMethod)]

Pour plus d'informations, consultez le guide d'Apple Travailler avec des protocoles .

44

Un protocole qui a déclaré avec le (@protocol syntax in Objective-C) est utilisé pour déclarer un ensemble de méthodes qu'une classe qui "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.

Éditer:

Veuillez trouver cet exemple. Dans le UIKit framework 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é déléguée), 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, assign) 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. Ainsi, si vous affectez une instance de MyTextFieldDelegateClass à la propriété déléguée 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! :)

10
iPhone developer.

Dans sa forme la plus simple, un délégué est un objet qui reçoit des messages d'un autre objet. Et tu le fais tout le temps.

Disons que vous aviez un objet de voiture avec un moteur.

@interface car : NSObject

@property (nonatomic) id engine;

@end

Il pourrait donc transmettre un message de démarrage au moteur.

[_engine start];

Le moteur agit en tant que délégué, vous lui passez juste un message.

Les protocoles le rendent plus formel et Xcode vérifiera que vous vous conformez aux méthodes obligatoires ou facultatives.

@property (nonatomic) id <engineDelegate> engine;

dit que l'objet moteur DOIT contenir la fonction start car dans la définition de protocole il l'a demandée.

@protocol engineDelegate 
 - (void) start;
@optional
 - (double) fuelLevel;
@end

Pourquoi les délégués et les protocoles sont-ils si cool? Eh bien parce que le moteur peut être un certain nombre de moteurs différents que vous pouvez utiliser à l'exécution, il peut s'agir d'un moteur à réaction, d'un moteur à combustion, d'un moteur à modulation de phase, cela n'a pas d'importance, tant qu'il est conforme au protocole. Et vous dites à Xcode qu'il est conforme en ajoutant le délégué à l'interface de classe.

@interface timeWarpDrive : NSObject <engineDelegate>
9
Chris