Error: ожидается спецификатор-классификатор-список до... в Objective C?
Всякий раз, когда я создаю следующий код, я получаю ошибку выше.
//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
Однако, когда я заменяю оператор import и вместо этого ставил ссылку на прямой класс, код компилируется.
//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
Может ли кто-нибудь объяснить?
Ответы
Ответ 1
Да, у меня тоже была проблема циклических зависимостей, когда я импортировал оба класса друг в друга. Я также не знал, что такое Передовые декларации. Я быстро искал его в Википедии, но он был плохо описан. Я нашел этот пост, который объясняет, что это такое и как они относятся к циклическому импорту. http://timburrell.net/blog/2008-11-23/effective-c-cyclical-dependencies/
Примечание. Ссылка продолжает снижаться, поэтому я просто PDF'd.
Ответ 2
Я получил эту ошибку с простой ошибкой... возможно, другие тоже делают?
ПРАВИЛЬНО:
@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
НЕПРАВИЛЬНО:
@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
Ответ 3
Просто следуйте этому правилу, чтобы избежать таких проблем:
Если объект используется только внутри файл реализации класса, используйте форвардная декларация в файле заголовка и импорт/включение в файл реализации. В противном случае используйте импортировать в заголовок.
Ответ 4
Это происходит потому, что вы забыли включить один из файлов заголовков. Я также получал такую же ошибку, но после правильного включения файла заголовка ошибка исчезла.
Ответ 5
Просто должен включить класс, который, казалось, был упущен:
#import "NameOfClass.h"
и он был отсортирован. Спасибо.
Ответ 6
Вы также можете проверить глупые орфографические ошибки. Например, у меня был класс под названием "MyUIViewController", но я написал:
@property (nonatomic, retain) MyViewController *myViewController;
И получил эту ошибку. После того, как я исправил его, выполните следующие действия:
@property (nonatomic, retain) MyUIViewController *myViewController;
Ошибка была исправлена, компьютеры были такими буквальными.
Ответ 7
У меня была эта проблема в проекте Objective-C ++ - в этом случае это одна из ошибок, которые могут возникнуть, если вы забудете назвать свой файл реализации .mm вместо .m.
Ответ 8
Я столкнулся с этой ошибкой при попытке ссылаться на протокол, который я сам создал.
Это показывает мой протокол, неправильный метод и то, что я считаю правильным.
in .h
// ------------------------------------ EtEmailDelegate Protocol -BEGIN- --------------------------------------
@protocol EtEmailDelegate
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error; //<-- This is really just one chunk from the MFMailComposeViewControllerDelegate
@end
// ------------------------------------ EtEmailDelegate Protocol -END- --------------------------------------
@interface ClsEtEmail : NSObject < MFMailComposeViewControllerDelegate> {
// owner
UIViewController *myUivc;
//EtEmailDelegate *myDelegate; // <--- the wrong way, throw error
id<EtEmailDelegate> *myDelegate; // <-- the right way (i think)
...
}
@property (nonatomic, readwrite, assign) id<EtEmailDelegate> delegate;
@end
Просто для полноты, вот как я реализую некоторые методы, которые также полагаются на протокол...
in .m
@synthesize delegate = myDelegate;
// my static initializer
+(id) objEtEmailWithUivc: (UIViewController*) theUivc delegate: (id <EtEmailDelegate>) theDelegate {
ClsEtEmail * obj = [[[ClsEtEmail alloc] initWithlUivc: theUivc delegate:theDelegate] autorelease];
return obj;
}
// my normal init
- (id)initWithlUivc: (UIViewController*) theUivc delegate: (id <EtEmailDelegate>) theDelegate {
self = [super init];
if (self) {
[self init_]; // my private init (not seen)
self.uivc = theUivc;
NSAssert([theDelegate conformsToProtocol:@protocol(EtEmailDelegate)],@"whoh - this can't is notE tEmailDelegate");
self.delegate = theDelegate;
}
return self;
}
Надеюсь, это поможет кому-то еще.
Ответ 9
Если вы удалили Precompiled Prefix Header, вы должны вручную импортировать файлы заголовков, необходимые в файл:
как
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>