Fab*_*eri 7 class objective-c categories
我试图@interface在.m文件中声明一个类别的私有.
对于正常的课程,我会这样做:
@interface ClassA ()
@end
@implementation ClassA
@end
Run Code Online (Sandbox Code Playgroud)
它会很顺利.
对于我尝试过类别的课程:
@interface ClassA (CategoryA) ()
@end
@implementation ClassA (CategoryA)
@end
Run Code Online (Sandbox Code Playgroud)
但它给出了各种不同的错误.我试图"扩展"一个类别,通过这种语法扩展类的方式@interface ClassA ().
我希望为该类别提供私有方法,并且我想知道,如果在暴露的接口中,我可以@interface在.m文件中放置第二个类别,它不会在类本身之外公开实例变量和方法.
像这样的东西:
ClassA的+ categoryA.h
@interface ClassA (CategoryA)
<some public methods>
@end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
现在这是在Xcode中给我一个警告:
接口'ClassA'上类别'CategoryA'的重复定义
有没有办法得到这种行为?
Jos*_*ell 14
不,您不能为单个类别声明两个接口.你可以做以下两件事之一:
昂格勒贝+ Humperdinck.h
#import "Englebert.h"
@interface Englebert (Humperdinck)
- (void) croon;
@end
Run Code Online (Sandbox Code Playgroud)
您可以使用不同的名称声明另一个类别以包含私有方法.然后可以在声明私有类接口的同一文件中使用它们:
昂格勒贝+ 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
Run Code Online (Sandbox Code Playgroud)
另一种选择是不要声明私有方法.如果您只是在实现块中定义它们,则可以在定义它们之后在该文件中的任何位置使用它们(对于最新版本的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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3927 次 |
| 最近记录: |