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

时间:2018-10-03 06:20:19

标签: ios class protocols forward-declaration

转发声明用于减少依赖关系并防止在涉及多个头文件的情况下不必要的导入。

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

假设我有以下内容:

ClassAlpha.h

@interface ClassAlpha: NSObject

-(void)helloWorld;

@end

ProtocolA.h

@protocol ProtocolA <NSObject>

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

@end

ClassBeta.h(符合ProtocolA)

@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的import语句,则不必说ClassBeta就不需要这样做。在这种情况下,最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

您应尽可能避免在标题中使用#import。因此,是的,您应该在ClassAlpha中使用@class ClassAlpha;(即PrototolA.h)的前向声明,因为要在参数声明中使用ClassAlpha *作为类型,您需要做的只是要知道的是ClassAlpha是一个类的名称。您不需要了解如何声明它。是的,您应该在ClassAlpha.h中导入ClassBeta.m;您应该尽可能多地导入实现文件而不是头文件。