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

Objective-C несколько определений классов в одном .h и .m

У меня есть два подкласса, один из которых имеет большую настройку, мы будем называть его Foo и другим подклассом, которому требуется только один метод, переопределенный и не нуждающийся в каких-либо дополнительных переменных, мы будем называть его Bar.

Бар будет одной из переменных Foo, поэтому, чтобы не иметь еще 2 файлов для работы с (.m и .h для Bar), я хотел бы взаимодействовать и реализовывать Bar в файлах Foo.h и .m.

Мое лучшее усилие дает мне несколько ошибок компилятора.

Файл .h выглядит так:

#import <UIKit/UIKit.h>

@interface Foo : FooSuperClass {
    Bar *barVariable;
}

@property (nonatomic, retain) Bar *barVariable;

-(void) fooMethod;
@end

@interface Bar : BarSuperClass {
}

@end

Файл .m выглядит так:

#import "Foo.h"


@implementation Foo
@synthesize barVariable;

-(void) fooMethod{
  //do foo related things
}
@end

@implementation Bar
- (void)barSuperClassMethodIWantToOverride{
}
@end

Я понимаю, что такого рода вещи, как правило, недооценивают, но я считаю, что это уместно в моей ситуации. Первая ошибка, которую я получаю, - это "ожидаемый спецификатор-классификатор-список перед баром".

Что я сделал неправильно, я уверен, что возможно иметь несколько деклараций/определений в одном файле.

4b9b3361

Ответ 1

В своем заголовке вы использовали Bar, прежде чем объявлять его. Решение. Поместите определение Bar до Foo.

Ответ 2

Компилятор учитывает только те типы, которые он видел ранее. Как отметил Николай, вы можете объявить Bar до Foo.

Однако это не всегда возможно. Для других ситуаций вы можете использовать @class для пересылки объявления класса.

т.е.

@class Bar;
@interface Foo : NSObject
{
    Bar *bar;
}
@end

@class Bar; сообщает компилятору, что существует класс с именем Bar и указатели на Bar должны считаться действительными.