是否可以为类别声明第二个@interface?

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)