【问题标题】:Conforming to a protocol on a class extension符合类扩展的协议
【发布时间】: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) &lt;YourProtocol&gt; @end@implementation Product (MyCategory) @dynamic theCommonProperty; @end。 - 然后“conformsToProtocol”工作,但您的子类解决方案(使用 mogenerator)可能更优雅。

标签: ios objective-c core-data


【解决方案1】:

我有一个类似的问题,我创建了一个类扩展:

@interface MyClass() <MyProtocol>

@end

MyClass 的实例为conformsToProtocol:@protocol(MyProtocol) 返回NO

我能够通过使用类别而不是扩展来解决问题:

MyClass+MyProtocol.h

@interface MyClass(MyProtocol) <MyProtocol>

@end

MyClass+MyProtocol.m

#import "MyClass+MyProtocol.h"

@implementation MyClass (MyProtocol)

@end

现在我班级的实例返回 YESconformsToProtocol:@protocol(MyProtocol)

请注意,必须包含@implementation MyClass (MyProtocol)。最初,我试图只包含头文件,希望 &lt;MyProtocol&gt; 声明就足够了,但 conformsToProtocol: 仍然返回 NO,直到我为类别添加 @implementation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多