30 votes

error : expected specifier-qualifier-list before...in Objective C ?

Lorsque je construis le code suivant, j'obtiens l'erreur ci-dessus.

//Controller.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "PolygonShape.h"
#import "PolygonView.h";

@interface Controller : NSObject
{
    IBOutlet UIButton *decreaseButton;
    IBOutlet UIButton *increaseButton;
    IBOutlet UILabel *numberOfSidesLabel;
    IBOutlet PolygonShape *shape;
    IBOutlet PolygonView *shapeView;
}
- (IBAction)decrease;
- (IBAction)increase;
- (void)awakeFromNib;
@end

//Controller.m
#import "Controller.h"

@implementation Controller
@end    

Cependant, lorsque je remplace l'instruction d'importation et que je mets une référence de classe en avant à la place, le code se compile.

//Controller.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "PolygonShape.h"
@class PolygonView;

@interface Controller : NSObject
{
    IBOutlet UIButton *decreaseButton;
    IBOutlet UIButton *increaseButton;
    IBOutlet UILabel *numberOfSidesLabel;
    IBOutlet PolygonShape *shape;
    IBOutlet PolygonView *shapeView;
}
- (IBAction)decrease;
- (IBAction)increase;
- (void)awakeFromNib;
@end

//Controller.m
#import "Controller.h"
#import "PolygonView.h"

@implementation Controller
@end

Quelqu'un peut-il expliquer ?

25voto

ChrisJF Points 657

Oui, j'ai aussi eu ce problème de dépendances cycliques où j'importais les deux classes l'une dans l'autre. Je ne savais pas non plus ce qu'étaient les Forward Declarations. Je l'ai rapidement cherché sur Wikipedia mais c'était mal décrit. J'ai trouvé ce post qui explique ce qu'elles sont et comment elles sont liées aux importations cycliques. http://timburrell.net/blog/2008-11-23/effective-c-cyclical-dependencies/

Note : Le lien ne cesse de tomber, alors j'ai juste Je l'ai mis en PDF .

8voto

Dan Brickley Points 251

J'ai eu cette erreur à cause d'une simple erreur... peut-être que d'autres font de même ?

CORRECT :

@interface ButtonDevice : NSObject 

{

    NSString *name;
    NSString *uri;
    NSString *icon;
}

    @property (nonatomic, retain) IBOutlet NSString *name;
    @property (nonatomic, retain) IBOutlet NSString *uri;
    @property (nonatomic, retain) IBOutlet NSString *icon;
@end

FAUX :

@interface ButtonDevice : NSObject 
{

    NSString *name;
    NSString *uri;
    NSString *icon;

    @property (nonatomic, retain) IBOutlet NSString *name;
    @property (nonatomic, retain) IBOutlet NSString *uri;
    @property (nonatomic, retain) IBOutlet NSString *icon;
}   
@end

6voto

Kentzo Points 1684

Il suffit de suivre cette règle pour éviter de tels problèmes :

Si un objet est uniquement utilisé en interne par le fichier d'implémentation de la classe, utilisez déclaration prospective dans le fichier d'en-tête et importer/inclure dans le fichier d'implémentation. Sinon, utilisez import dans l'en-tête.

3voto

meet bhatha Points 31

Cela se produit parce que vous avez oublié d'inclure l'un des fichiers d'en-tête. J'ai également obtenu le même type d'erreur, mais après avoir inclus correctement le fichier d'en-tête, l'erreur a disparu.

3voto

Smotyn Points 31

Il faut juste inclure une classe qui semble avoir été négligée :

#import "NameOfClass.h"

et c'était réglé. Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X