déclaration de protocole ?
Voila j'ai un pti soucis de compréhension,
a quoi sert le @protocol en rouge
par rapport a celui en vert
je n'ai rien dans celui en vert et pourtant il m'est indispensable pour que ca marche.
Qui definit quoi dans tout ca au niveau des protocoles?
// bidule.h
@class Bidule;
@protocol FluxRSSParserDelegate;
@interface FluxRSSParser : NSObject <NSXMLParserDelegate>{
FluxRSS * _currentItem;
NSMutableString * _currentItemValue;
NSMutableArray * _rssItems;
// id est un type dynamique
id<FluxRSSParserDelegate> _delegate;
NSOperationQueue *_retrieverQueue;
}
@property(nonatomic, retain) FluxRSS * currentItem;
@property(nonatomic, retain) NSMutableString * currentItemValue;
@property(readonly) NSMutableArray * rssItems;
@property(nonatomic, assign) id<FluxRSSParserDelegate> delegate;
@property(nonatomic, retain) NSOperationQueue *retrieverQueue;
- (void)startProcess;
@end
@protocol FluxRSSParserDelegate <NSObject, NSXMLParserDelegate>
@end
a quoi sert le @protocol en rouge
par rapport a celui en vert
je n'ai rien dans celui en vert et pourtant il m'est indispensable pour que ca marche.
Qui definit quoi dans tout ca au niveau des protocoles?
// bidule.h
@class Bidule;
@protocol FluxRSSParserDelegate;
@interface FluxRSSParser : NSObject <NSXMLParserDelegate>{
FluxRSS * _currentItem;
NSMutableString * _currentItemValue;
NSMutableArray * _rssItems;
// id est un type dynamique
id<FluxRSSParserDelegate> _delegate;
NSOperationQueue *_retrieverQueue;
}
@property(nonatomic, retain) FluxRSS * currentItem;
@property(nonatomic, retain) NSMutableString * currentItemValue;
@property(readonly) NSMutableArray * rssItems;
@property(nonatomic, assign) id<FluxRSSParserDelegate> delegate;
@property(nonatomic, retain) NSOperationQueue *retrieverQueue;
- (void)startProcess;
@end
@protocol FluxRSSParserDelegate <NSObject, NSXMLParserDelegate>
@end
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Or en effet c'est le cas puisque dans ta classe "FluxRSSParser" tu as bien une variable d'instance nommée "_delegate" qui est indiquée comme étant de type "id<FluxRSSParserDelegate>", donc un type générique mais devant se conformer au protocole sus-nommé.
Si tu n'avais pas mis la déclaration du @protocol en rouge avant d'écrire l'@interface de ta classe FluxRSSParser, il t'aurait sorti une erreur en arrivant sur "id<FluxRSSParserDelegate> _delegate" en te disant qu'il ne connaissais pas ce protocole FluxRSSParserDelegate. La solution est donc :
Après, l'intérêt d'avoir un @protocol qui est vide est discutable. En général, quand on définit un @protocol, c'est pour lui mettre des méthodes dedans pour indiquer que les classes qui se conforment à se protocole doivent répondre à ces méthodes. Mais je suppose que tu suis un tutoriel et que ce dernier t'a incité (très justement) à créer ce @protocol, dans l'idée dans les prochaines étapes à rajouter des méthodes à ton @protocol, et donc ce code n'est sans doute pas dans son état final ?
Au pire déclarer un @protocol sans aucune méthode n'a pas grand intérêt mais peut être utile pour l'évolutivité (si justement tu comptes rajouter des méthodes à terme) ou pour grouper des protocoles : dans ton cas le @protocol FluxRSSParserDelegate n'est qu'un protocole qui se conforme lui-même à deux protocoles, le protocole <NSObject> et le protocole <NSXMLParserDelegate>, et donc qui va répondre à toutes les méthodes de ces deux protocoles (mais n'en rajoute aucune autre... du moins pour l'instant)