在协议定义的方法参数中调用的 类 的前向声明
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 文件。
前向声明用于减少依赖性并防止涉及多个头文件的不必要的导入。
话虽这么说,我应该如何处理这种情况?
假设我有以下内容:
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 文件。