我想为实现SOManagedObject协议的NSManagedObject的子类添加一些方法。我试过像这样定义它:
@interface NSManagedObject <SOManagedObject> (MyExtensionMethods)
...
@end
......但这似乎没有效果。如何定义向实现特定协议的类添加方法的类别?
答案 0 :(得分:4)
一般而言,在所有这些类上定义这样的类别是不容易解决的。但是您的实际问题似乎更简单:如何将类别方法添加到NSManagedObject
以仅用于实现<SOManagedObject>
的子类?这是可以解决的。
您要做的是将方法添加到NSManagedObject
,然后检查您正在使用的实例是否可以处理您要从<SOManagedObject>
发送的消息。
让我们假设我们得到了:
/* SOManagedObject.h */
@protocol SOManagedObject
- (void)frobble_so;
- (void)bobble_so;
@end
现在让我们为实现NSManagedObject
的所有SOManagedObject
子类添加一个类别方法:
/* NSManagedObject+SOConvenience.h */
@interface NSManagedObject (SOConvience)
/* Frobbles and bobbles - no effect on non-<SOManagedObject>-conforming
* instances. */
- (void)frobbleAndBobble_so;
@end
为此,我们实现了这样的方法:
/* NSManagedObject+SOConvenience.m */
@implementation NSManagedObject (SOConvenience)
- (void)frobbleAndBobble_so
{
if (![self conformsToProtocol:@protocol(SOManagedObject)]) return;
NSLog(@"%s: Thunderbirds are GO! Let's frobble and bobble!", __func__);
[self frobble_so];
[self bobble_so];
}
@end
您可以选择断言以确保您不将方法发送到错误的对象,或者您可以使用respondsToSelector:
而不是检查协议一致性。无论什么漂浮在你的船上,但这种一般的方法应该带你到你想去的地方。
答案 1 :(得分:1)
我认为不可能。之前回答了类似的问题:
答案 2 :(得分:0)
编辑:我误解了这个问题;我不认为可以在不弄乱Objective-C运行时的情况下做你想做的事情。请参阅Dave在下面的评论,了解为什么我的答案不正确。
如果你交换协议和类别表示法,你应该能够这样做:
@interface NSManagedObject (MyExtensionMethods) <SOManagedObject>
...
@end
答案 3 :(得分:0)
Adam Sharp posted a solution为我工作。
它涉及3个步骤:
@optional
的方法。查看链接以获取完整详细信息。