Подтвердить что ты не робот

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

Может ли кто-нибудь объяснить?

4b9b3361

Ответ 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>