如何向实现已知协议的匿名类添加属性“ objective-c扩展”

时间:2018-08-30 11:39:21

标签: objective-c

我有一个现有班级,但没有该班级的资料,我想 在类中添加一个属性。私有类实现了一个公开的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) {
        // 
     }

1 个答案:

答案 0 :(得分:0)

这里似乎有两个问题:

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

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

// SomeClass.h

@interface SomeClass : NSObject <ComplexNumber>

@end

这似乎很奇怪,但这足以通过构建过程的编译阶段,并允许您在代码中使用该属性。私有类的现有实现将足以解决链接阶段。

正如Daniele Pantaleone所指出的那样,第二部分非常接近Objective-C: Property / instance variable in category。但是,我添加它是为了完善:

// 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