在协议定义的方法参数中调用的 类 的前向声明

Forward declaration for classes called within method arguments of a protocol definition

前向声明用于减少依赖性并防止涉及多个头文件的不必要的导入。

话虽这么说,我应该如何处理这种情况?

假设我有以下内容:

ClassAlpha.h

@interface ClassAlpha: NSObject

-(void)helloWorld;

@end

ProtocolA.h

@protocol ProtocolA <NSObject>

-(void)doSomethingWithAlpha:(ClassAlpha *__Nonnull)alpha;

@end

ClassBeta.h(符合协议A)

@interface ClassBeta: NSObject<ProtocolA>

@end

ClassBeta.m

#import "ClassAlpha.h"

@implementation ClassBeta

-(void)doSomethingWithAlpha:(ClassAlpha *)alpha
{
    NSLog(@"Hello");
}
@end

在ProtocolA.h中,我应该使用ClassAlpha 的前向声明吗?但是,如果我这样做,那将意味着 ClassBeta 必须是在其实现中导入 ClassAlpha 的那个,同时导入 ProtocolA。或者,如果我在 ProtocolA 中使用 ClassAlpha 的导入语句,不用说 ClassBeta 就不需要这样做。这种情况的最佳做法是什么?

您应该尽可能避免在 header 中出现 #import。所以,是的,您应该在 PrototolA.h 中使用 ClassAlpha(即 @class ClassAlpha;)的前向声明,因为要在参数声明中使用 ClassAlpha * 作为类型,您只需要要知道的是 ClassAlpha 是一个 class 的名字。您不需要了解有关它的声明方式的任何其他信息。是的,您应该在 ClassBeta.m 中导入 ClassAlpha.h;您应该尽可能多地在实现文件中导入,而不是 header 文件。