如何将属性"objective-c extension"添加到实现已知协议的匿名类



我有一个现有的类,我没有源代码,我想 向类中添加属性。私有类实现了一个公开的known protocol,但class type is not exposed.

发生了一些回调,我收到了名为answer的对象。

我想扩展 ComplexNumber 类型以具有更多属性, 例如

@interface NSObject()<ComplexNumber>
@property (assign) BOOL offline;
@end
@implementation SomeClass 
didReceiveAnswer:id<ComplexNumber>answer forEquation:(NSString*)equation {
//
if (answer.offline) {
// 
}
}
@end

这也失败了: 将unknown type转换为NSObject型:

if (((NSObject*)answer).offline) {
// 
}

这里似乎有两个问题:

  • 访问私有课程
  • 向其添加属性。

如果您知道私有类的名称,则可以简单地使用它再次定义它:

// SomeClass.h
@interface SomeClass : NSObject <ComplexNumber>
@end

这可能看起来很奇怪,但这足以通过生成过程的编译阶段,并允许您在代码中使用该属性。私有类的现有实现将足以处理链接阶段。

正如Daniele Pantaleone指出的那样,第二部分非常接近Objective-C:类别中的属性/实例变量。但是,为了完整起见,我添加了它:

// ComplexNumber.h
@protocol ComplexNumber <NSObject>
@property (assign) BOOL offline;
@end

//ComplexNumber.m
@import ObjectiveC;
@implementation NSObject (ComplexNumber)
static void *ComplexNumberKey = &ComplexNumberKey;
-(void)setOffline:(BOOL)offline
{
objc_setAssociatedObject(self, &ComplexNumberKey, @(offline), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(BOOL)offline
{
NSNumber *offline = objc_getAssociatedObject(self, &ComplexNumberKey);
return offline.boolValue;
}
@end

最新更新