【发布时间】:2013-05-19 00:14:55
【问题描述】:
我正在开发一个 Core Data 应用程序,其中我的实体有一个名为 deleted 的公共属性(我正在应用程序中实现逻辑删除)。
虽然所有实体都可以从一个公共实体继承,但我想避免它(我不喜欢使用继承时所有实体最终都在同一个表中,但我离题了)。
为了保持代码整洁,我实现了这样的协议:
@protocol SPRLogicalDeleteEntity <NSObject>
@property (nonatomic, retain) NSNumber * deleted;
@end
我希望所有的NSManagedObject 子类都符合这个协议,所以代码看起来更好。为了使代码可维护,我不想将协议添加到生成的NSManagedObject 子类中,因此我创建了一个类扩展:
@interface Product () < SPRLogicalDeleteEntity >
@end
我仅用于标记实体符合我的协议。
我遇到的问题是对conformsToProtocol:@protocol(SPRLogicalDeleteEntity) 的调用返回NO。
我没有尝试过 mogenerator(但如果严格要求我可以)。任何提示?这可能是因为类扩展是空的,因此没有加载吗?
【问题讨论】:
-
是的,我是。问题是它没有附带的实现块,因为它只是一个标记。
-
哦,我错误地删除了我的评论。无论如何,如果它是一个类扩展,那么它就有一个实现块。这是
Product.m里面的那个。只需确保包含来自Product.m的扩展标头即可。 -
旁注:不要将托管对象属性称为“已删除”,否则可能会发生奇怪的事情(比较 stackoverflow.com/a/16003894/1187415)。
-
@Maarten 我会觉得脏得要命:)
-
@pgb:我能想到的唯一选择是创建一个类 category 而不是扩展:
@interface Product (MyCategory) <YourProtocol> @end和@implementation Product (MyCategory) @dynamic theCommonProperty; @end。 - 然后“conformsToProtocol”工作,但您的子类解决方案(使用 mogenerator)可能更优雅。
标签: ios objective-c core-data