引用 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 类是否存在问题,因为它们都是 NSManagedObjects 并且两者之间存在联系?

【问题讨论】:

【参考方案1】:

编译器编译 .m 文件,而这些文件又包含 .h 文件。

所以我假设在包含“SSSelectingCategory.h”的.m文件中,之前定义了SSCategory,这样编译器编译协议就没有问题了。

另一方面,如果包含“SSSelectingIcon.h”而之前没有定义SSIcon,编译器将在那里中止并出现错误。

在任何情况下,在 .h 文件中包含所需的接口(或前向声明所需的类)都是有意义的,因为这样可以在 Xcode 中完成代码。

【讨论】:

感谢 Martin R,正如您所描述的那样。又学到了一课!

以上是关于引用 NSManagedObject 子类的协议中出现不一致的“未知类型名称”错误的主要内容,如果未能解决你的问题,请参考以下文章

带有循环的 NSManagedObject 子类的深拷贝

NSManagedObject 子类 (CoreData) 中数字的 KVC 合规性

是否不需要在 Swift 3 中继承 NSManagedObject ?

NSManagedObject 和类别/子类

iOS 14 Beta - Swift UI 中的核心数据错误:任何模型中都没有 NSEntityDescriptions 声明 NSManagedObject 子类

给另一个对象一个 NSManagedObject