我有两个子类,一个有很多自定义,我们称之为Foo,另一个子类只需要重写1个方法,并且不需要任何其他变量,我们称之为Bar。
Bar将是Foo的变量之一,所以为了避免再使用2个文件(.m和.h for 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
我意识到这类事情通常会受到不满,但我觉得这在我的情况下是合适的。我得到的第一个错误是“Bar之前的预期说明符 - 限定符列表”。
我做错了什么,我很确定在一个文件中可以有多个声明/定义。
答案 0 :(得分:27)
编译器仅考虑之前看到的有效类型。正如尼古拉所说,你可以在Bar
之前宣布Foo
。
然而,这并非总是可行的。对于其他情况,您可以使用@class
转发声明该类。
即
@class Bar;
@interface Foo : NSObject
{
Bar *bar;
}
@end
@class Bar;
告诉编译器存在一个名为Bar的类,指向Bar的指针应被视为有效。
答案 1 :(得分:9)
在您的标题中,您在声明之前已使用Bar
。解决方案:在Bar
之前添加Foo
的定义。