引用 NSManagedObject 子类的协议中出现不一致的“未知类型名称”错误
Posted
技术标签:
【中文标题】引用 NSManagedObject 子类的协议中出现不一致的“未知类型名称”错误【英文标题】:Inconsistent 'Unknown type name' error in protocol referencing NSManagedObject subclasses 【发布时间】:2012-09-08 20:51:24 【问题描述】:我的项目中声明了两个协议。我写的第一个叫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
s 并且两者之间存在联系?
【问题讨论】:
【参考方案1】:编译器编译 .m 文件,而这些文件又包含 .h 文件。
所以我假设在包含“SSSelectingCategory.h”的.m文件中,之前定义了SSCategory
,这样编译器编译协议就没有问题了。
另一方面,如果包含“SSSelectingIcon.h”而之前没有定义SSIcon
,编译器将在那里中止并出现错误。
在任何情况下,在 .h 文件中包含所需的接口(或前向声明所需的类)都是有意义的,因为这样可以在 Xcode 中完成代码。
【讨论】:
感谢 Martin R,正如您所描述的那样。又学到了一课!以上是关于引用 NSManagedObject 子类的协议中出现不一致的“未知类型名称”错误的主要内容,如果未能解决你的问题,请参考以下文章
NSManagedObject 子类 (CoreData) 中数字的 KVC 合规性
是否不需要在 Swift 3 中继承 NSManagedObject ?
iOS 14 Beta - Swift UI 中的核心数据错误:任何模型中都没有 NSEntityDescriptions 声明 NSManagedObject 子类