我的项目中声明了两个协议。我写的第一个名为SSSelectingCategory.h
#import <Foundation/Foundation.h>
@protocol SSSelectingCategory <NSObject>
@required
@property (nonatomic, strong) SSCategory *selectedCategory;
@end
第二个是SSSelectingIcon.h
#import <Foundation/Foundation.h>
@protocol SSSelectingIcon <NSObject>
@required
@property (nonatomic, strong) SSIcon *selectedIcon;
@end
奇怪的是,第一个协议编译时没有任何错误或警告,而第二个协议正在抛出Unknown type name 'SSIcon'
。
我知道这个问题的答案是在我的第二个协议中使用前向声明,如下所示:
#import <Foundation/Foundation.h>
@class SSIcon;
@protocol SSSelectingIcon <NSObject>
@required
@property (nonatomic, strong) SSIcon *selectedIcon;
@end
但现在这让我认为SSSelectingCategory.h
协议首先不应该编译,因为我没有放任何明确的#import
或前向类声明。
我可以安静地编译器并继续编码,但是我想知道是否有一些奇怪的事情发生在Xcode上,或者我是否遗漏了一些细节,因为两种协议都非常简单。 SSCategory
和/或SSIcon
类是否存在问题,因为它们都是NSManagedObject
并且存在将两者联系起来的关系?
答案 0 :(得分:1)
编译器编译.m文件,后者又包含.h文件。
所以我假设在包含“SSSelectingCategory.h”的.m文件中,之前定义了SSCategory
,因此编译器编译协议没有问题。
另一方面,如果在没有定义SSIcon
的情况下包含“SSSelectingIcon.h”,编译器将在那里中止并出现错误。
在任何情况下,在.h文件中包含所需的接口(或转发声明所需的类)是有意义的,因为这样可以在Xcode中启用代码完成。