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

Réponses

  • malgachemalgache Membre
    02:10 modifié #2
    Si je me trompe pas, celui en rouge indique à  ton interface qu'il existe un protocole qui s'appel FluxRSSParserDeleagate et celui en vers c'est la déclaration de ton protocol, c'est pour ca que t'es obligé d'avoir le vert
  • AliGatorAliGator Membre, Modérateur
    juin 2011 modifié #3
    Oui en fait celle en rouge c'est juste pour dire au compilateur "t'inquiète pas, le protocole existe, si tu le rencontre qqpart dans une déclaration de type, ne me sors pas une erreur".
    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 :
    • soit de déclarer ton @protocol FluxRSSParserDelegate (la totale, jusqu'à  son @end) avant la classe FluxRSSParser qui utilise ce type (autrement dit, d'enlever ta déclaration en rouge, et de déplacer ta définition en vert avant la @interface FluxRSSParser et non après). Comme ça au moment où il compile le code de la classe FluxRSSParser , il sait que ce protocole FluxRSSParserDelegate existe. Ceci dit, cette solution de déclarer le @protocol avant n'est pas toujours possible, en particulier s'il y a des références croisées entre ton protocole et la classe qui l'utilise.
    • D'où l'intérêt des "forward declarations" (c'est comme ça que s'appelle la déclaration en rouge, c'est pour déclarer "en amont" (forward) que ça existe), c'est donc la 2e solution, et celle que tu as dans ton code : à  savoir de juste lui dire "le protocole existe" avant la classe (ce que fait ta déclaration en rouge), et le définir complètement plus tard (en vert dans ton code)


    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)
  • AliGatorAliGator Membre, Modérateur
    02:10 modifié #4
    Sujet déplacé dans la section commune iOS/OSX
Connectez-vous ou Inscrivez-vous pour répondre.