如何确定Objective-C属性的类?

Kyl*_*ery 5 properties objective-c

好吧,所以说我在课堂上有一个属性:

@interface MyObject : NSObject {
    MyOtherObject *someOtherObject;
}

@property (nonatomic, copy) MyOtherObject *someOtherObject;

@end
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一些东西来将API响应反序列化为正确的对象,而无需明确定义每个api属性映射到的类.那么,有什么办法让我找出一个属性是什么类,即使它是nil什么?我正在寻找的是一些[MyObject classForProperty:@"someOtherObject"]返回Class对象的方法.注意 - 我不是在寻找isKindOfClass:或只是class,因为那些不会对nil值有效.

最糟糕的情况是,我可以手动定义一个属性类列表,但是如果有一些内置方法可以做到这一点真的很好.

Kyl*_*ery 2

好吧,我在遇到这个问题后最终弄清楚了这一点:In Objective-C Define if a Property is an int, float, double, NSString, NSDate, NSNumber, etc

这是代码:

@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
Run Code Online (Sandbox Code Playgroud)

它似乎对我来说工作得很好,但任何修改都是绝对受欢迎的。