Je l'ai vu l'utilisation des protocoles Objective-C se sert d'une manière telle que:Comment gérer les protocoles Objective-C qui contiennent des propriétés?
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
Je l'ai vu ce format utilisé au lieu d'écrire une superclasse en béton qui étendent les sous-classes. La question est, si vous vous conformez à ce protocole, avez-vous besoin de synthétiser les propriétés vous-même? Si vous étendez une superclasse, la réponse est évidemment non, vous n'avez pas besoin de le faire. Mais comment traiter les propriétés qu'un protocole doit respecter? Pour ma compréhension, vous devez toujours déclarer les variables d'instance dans le fichier d'en-tête d'un objet qui se conforme à un protocole qui nécessite ces propriétés. Dans ce cas, pouvons-nous supposer qu'ils ne sont qu'un principe directeur? CLearly le même n'est pas le cas pour une méthode requise. Le compilateur va claquer votre poignet pour exclure une méthode requise qu'un protocole liste. Quelle est l'histoire des propriétés?
Voici un exemple qui génère une erreur de compilation (Note: J'ai parés le code qui ne reflète pas sur le problème à la main):
MyProtocol.h
@protocol MyProtocol <NSObject>
@required
@property (nonatomic, retain) id anObject;
@optional
TestProtocolsViewController.h
- (void)iDoCoolStuff;
@end
#import <MyProtocol.h>
@interface TestProtocolsViewController : UIViewController <MyProtocol> {
}
@end
TestProtocolsViewController.m
#import "TestProtocolsViewController.h"
@implementation TestProtocolsViewController
@synthesize anObject; // anObject doesn't exist, even though we conform to MyProtocol.
- (void)dealloc {
[anObject release]; //anObject doesn't exist, even though we conform to MyProtocol.
[super dealloc];
}
@end
Pour les propriétés définies dans un protocole, vous avez toujours besoin d'un "@synthesize" même dans l'environnement d'exécution moderne, ou vous devez dupliquer le "@property" dans votre définition d'interface pour obtenir l'auto-synthèse. –
@JeffreyHarris Qu'en est-il de même dans Swift ?? –
@KaranAlangat - il n'y a rien de tel que \ @synthesize dans Swift, mais tout comme ObjC, vous devez déclarer la propriété dans une classe qui prétend se conformer au protocole. Dans Swift, vous pouvez créer une catégorie qui définit une implémentation par défaut d'une fonction, mais autant que j'ai pu le dire, vous ne pouvez pas avoir une propriété par défaut pour un protocole. –