我有一个现有的类,我没有源代码,我想 向类中添加属性。私有类实现了一个公开的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