2012-12-12 54 views
3

设置:如何获取类集群中“顶级”类的名称?

我有通过JSON进入的数据。

使用NSJSONSerialization我将JSON转换为对象。

在JSON一个数字值,来在Objective-C为几个不同的可能的类类型:

NSNumber, NSDecimalNumber or __NSCFNumber) - 所有这些都NSNumber下类群集。


问题:

1)我需要一种方法来获取类集群“保护伞”类 - NSNumber,当我有任何类型NSNumber, NSDecimalNumber or __NSCFNumber的值。

同样适用于字符串。我需要一种方法来获得NSString,当我有这些:NSString, NSMutableString, __NSCFString, __NSCFConstantString

2)例如,如果我可以通过代码获取NSString群集中所有类的列表,它也可以工作。然后我可以在运行时动态构建一个列表,并确保它是完整的。


我有什么至今:

到目前为止,我无法想出一个明智的方式来做到这一点。所以我有一个允许类型的列表,但恐怕它可能不完整+它不觉得它是最好的解决方案。

代码: https://github.com/icanzilb/JSONModel/blob/master/JSONModel/JSONModel.m#L45

+0

另请注意,'NSCFBoolean'是'NSNumber'的一个子类。 – 2012-12-12 17:27:57

回答

2

你可以这样做:

id object = // obtain the object somehow 

Class cls = Nil; // for now 

// property list types, roughly equivalent to JSON's fundamental types 
NSArray *classes = @[[NSString class], [NSNumber class], [NSArray class], [NSDictionary class], [NSData class], [NSDate class]]; 

Class c; 
for (c in classes) { 
    if ([object isKintOfClass:c]) { 
     cls = c; 
     break; 
    } 
} 

您可以通过添加其他类的classes阵列扩展列表。最后,cls将包含类群集,其中object是一个实例,或Nil,如果它不是任何一个的实例。

+0

这适用于Core Foundation类。请记住,那里可能会有更多的班级集群。 – Berik

+0

@Berik我没有说明/暗示这是普遍的,OP的问题也不需要它是如此。 – 2013-02-27 12:16:01