我正在尝试在.m文件中为某个类别声明私有@interface
。
对于正常的课程,我会这样做:
@interface ClassA ()
@end
@implementation ClassA
@end
它会很顺利。
对于我尝试过类别的课程:
@interface ClassA (CategoryA) ()
@end
@implementation ClassA (CategoryA)
@end
但它提供了各种不同的错误。我试图“扩展”一个类别,即通过这种语法@interface ClassA ()
扩展类的方式。
我想拥有该类别的私有方法,我想知道,如果在暴露的接口中,我可以在.m文件中放置第二个类别@interface
,它不会暴露实例类本身之外的变量和方法。
这样的事情:
ClassA的+ categoryA.h
@interface ClassA (CategoryA)
<some public methods>
@end
ClassA + categoryA.m文件
@interface ClassA (CategoryA)
<some private methods>
@end
@implementation ClassA (CategoryA)
<here I want to be able to call the private methods above>
@end
现在这是在Xcode中给我一个警告:
界面'ClassA'上类别'CategoryA'的重复定义
有没有办法解决这个问题?
答案 0 :(得分:14)
不,您不能为单个类别声明两个接口。你可以做以下两件事之一:
昂格勒贝+ Humperdinck.h
#import "Englebert.h"
@interface Englebert (Humperdinck)
- (void) croon;
@end
您可以使用其他名称声明另一个类别以包含私有方法。然后可以在声明私有类别接口的同一文件中使用它们:
昂格勒贝+ Humperdinck.m
#import "Englebert+Humperdinck.h"
@interface Englebert (HumperdinckPrivate)
- (void) warmUp;
@end
@implementation Englebert (HumperdinckPrivate)
- (void)warmUp {
NSLog(@"Warm up");
}
@end
@implementation Englebert (Humperdinck)
- (void)croon {
[self warmUp];
NSLog(@"Croon");
// etc.
}
@end
另一种选择是不要声明私有方法。如果您只是在实现块中定义它们,则可以在定义它们之后在该文件中的任何位置使用它们(对于最新版本的Xcode / LLVM,顺序实际上并不重要 - 未声明的方法可以在任何地方使用它们被定义的文件)。没有其他文件能够看到这些方法。
昂格勒贝+ Humperdinck.m
#import "Englebert+Humperdinck.h"
@implementation Englebert (Humperdinck)
/* Undeclared private method */
- (void)warmUp {
NSLog(@"Warm up");
}
- (void)croon {
[self warmUp];
NSLog(@"Croon");
// etc.
}
@end
答案 1 :(得分:1)
待办事项
@interface ClassA (CategoryA)
@end
@implementation ClassA (CategoryA)
@end
相反。类别不能包含实例变量。你在说什么样的错误?
答案 2 :(得分:0)
@interface ClassA ()
是anonymous category,您可以将它们用作接口,并在ClassA
实现中定义实现。 @interface ClassA (CategoryA) ()
是语法错误,应该是@interface ClassA (CategoryA)
编辑:
要为类创建私有方法,请在该类“.m
”文件中创建:
@interface ClassA ()
// Private functions declared
@end
@implementation ClassA
// Private functions defined
// Other functions defined
@end
对于命名类别也可以这样做,但是您需要单独定义实现以避免警告。同样,在.m
文件中:
@interface ClassA (hidden)
// Private functions declared
@end
@implementation ClassA (hidden)
// Private functions declared
@end
@implementation ClassA
// Other functions defined
@end