如何确定Objective-C属性的类别?
好,假设我有一个类的属性:如何确定Objective-C属性的类别?,objective-c,properties,Objective C,Properties,好,假设我有一个类的属性: @interface MyObject : NSObject { MyOtherObject *someOtherObject; } @property (nonatomic, copy) MyOtherObject *someOtherObject; @end 我试图创建一些东西,将API响应反序列化到正确的对象中,而不显式定义每个API属性映射到的类。那么,有没有办法让我知道a类属性是什么,即使它是nil?我要寻找的是像[MyObject class
@interface MyObject : NSObject {
MyOtherObject *someOtherObject;
}
@property (nonatomic, copy) MyOtherObject *someOtherObject;
@end
我试图创建一些东西,将API响应反序列化到正确的对象中,而不显式定义每个API属性映射到的类。那么,有没有办法让我知道a类属性是什么,即使它是nil
?我要寻找的是像[MyObject classForProperty:@“someOtherObject”]
这样的方法,它将返回一个类
对象。注意——我不是在寻找类:的类型,也不是只寻找类
,因为它们对nil
值不起作用
最糟糕的情况是,我可以手动定义一个属性类列表,但如果有一些内置的方法来实现这一点,那就太好了。好的,在遇到这个问题后,我终于明白了这一点: 代码如下:
@interface NSObject (Properties)
+ (Class)classForProperty:(NSString *)propertyName;
@end
#import <objc/runtime.h>
@implementation NSObject (Properties)
+ (Class)classForProperty:(NSString *)propertyName {
const char *attributes = property_getAttributes(class_getProperty([self class], [propertyName UTF8String]));
NSString *attributesString = [NSString stringWithUTF8String:attributes];
NSArray *parts = [attributesString componentsSeparatedByString:@","];
NSString *typeString = [[parts objectAtIndex:0] substringFromIndex:1];
if ([typeString hasPrefix:@"@"] && [typeString length] > 1) {
NSString *name = [typeString substringWithRange:NSMakeRange(2, [typeString length]-3)];
Class theClass = NSClassFromString(name);
return theClass;
}
return nil;
}
@end
@接口对象(属性)
+(Class)classForProperty:(NSString*)propertyName;
@结束
#进口
@实现对象(属性)
+(类)classForProperty:(NSString*)propertyName{
const char*attributes=property\u getAttributes(class\u getProperty([self class],[propertyName UTF8String]);
NSString*AttributeString=[NSString stringWithUTF8String:attributes];
NSArray*parts=[属性字符串组件由字符串分隔:@“,”];
NSString*typeString=[[parts objectAtIndex:0]substringFromIndex:1];
如果([typeString hasPrefix:@“@”]&&[typeString length]>1){
NSString*name=[typeString substringWithRange:NSMakeRange(2[typeString长度]-3)];
Class theClass=NSClassFromString(名称);
返回类;
}
返回零;
}
@结束
这对我来说似乎很有效,但任何修改都是绝对欢迎的。EWW。。。你真的不想那样做。
@property
类型编码字符串非常脆弱,在未来的编译器中可能会发生更改,通常不鼓励使用这种编码模式。创建自己的模型描述层(或使用核心数据)要好得多。为什么不直接使用键值编码进行反序列化呢?嗯——很高兴知道,也许我最终会手动使模型描述更紧张——除非我遗漏了什么,否则您仍然无法确定属性的类别,对吗?