测试对象的键而不是键值

时间:2016-03-11 16:03:14

标签: ios objective-c

我正在使用valueForKey:来检查isKindOfClass:。但其中一些没有价值,因此不会返回任何东西。如何测试实际密钥而不是密钥值?如果object.animal是带有“@ Cat”的NSString,那么显然[[object valueForKey @"animal"] isKindOfClass:[NSString class]]会将其作为字符串检出。但如果object.animal没有给出值,我仍然想知道animal的属性是什么类型。

2 个答案:

答案 0 :(得分:0)

回答你的问题是property type or class using reflection

虽然我必须指出使用它是非常不可取的。如果你真的需要诉诸于此,你可能想重新思考一下。

答案 1 :(得分:0)

您可以使用Objective-C运行时为属性获取此信息。如果你有

@property (readonly) NSString *animal;

您可以使用以下代码:

#import <objc/runtime.h>

// ... 

objc_property_t property = class_getProperty(object.class, "animal");
const char* attr = (property != NULL) ? property_getAttributes(property) : NULL;

attr是C字符串,如下所示:"T@\"NSString\",R"。您可以从此字符串中提取类名。有关property_getAttributes结果,请参阅Apple documentation。请注意,只有将animal声明为属性时,此解决方案才有效。

处理这种情况要容易得多:

@interface MyObject : NSObject

@property (readonly) NSString *animal;
+ (Class)animalClass;

@end

@implementation MyObject

+ (Class)animalClass {
    return [NSString class];
}

@end