gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:35:40 24 4
gpt4 key购买 nike

我正在尝试在 .m 文件中为类别声明私有(private) @interface

对于普通的类(class),我会这样做:

@interface ClassA ()

@end

@implementation ClassA

@end

它会很顺利地工作。

对于我尝试过的类别类:

@interface ClassA (CategoryA) ()

@end

@implementation ClassA (CategoryA)

@end

但它给出了各种不同的错误。我正在尝试“扩展”一个类别,即通过此语法 @interface ClassA () 扩展类的方式。

我想要类别的私有(private)方法,我想知道除了公开的接口(interface)之外,我是否可以在 .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 中给我一个警告:

Duplicate definition of category 'CategoryA' on interface 'ClassA'

有什么办法可以实现这种行为吗?

最佳答案

不可以,您不能为一个类别声明两个接口(interface)。您可以执行以下两项操作之一:

Englebert+Humperdinck.h

#import "Englebert.h"

@interface Englebert (Humperdinck)

- (void) croon;

@end

您可以用不同的名称声明另一个 类别以包含私有(private)方法。然后可以在声明私有(private)类别接口(interface)的同一文件中使用它们:

Englebert+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

另一种选择是不声明私有(private)方法。如果你只是在实现 block 中定义它们,你可以在定义它们之后在该文件中的任何位置使用它们(对于最新版本的 Xcode/LLVM,顺序实际上并不重要——未声明的方法可以在任何地方使用定义它们的文件)。其他文件将无法看到这些方法。

Englebert+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

关于objective-c - 是否可以为类别声明第二个@interface?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9664727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com