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