检查对象是NSArray还是NSDictionary

Cha*_*ung 44 objective-c

根据主题,我如何检查对象是NSArray还是NSDictionary?

zak*_*een 95

if([obj isKindOfClass:[NSArray class]]){
    //Is array
}else if([obj isKindOfClass:[NSDictionary class]]){
    //is dictionary
}else{
    //is something else
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*ant 13

尝试

[myObject isKindOfClass:[NSArray class]]
Run Code Online (Sandbox Code Playgroud)

[myObject isKindOfClass:[NSDictionary class]]
Run Code Online (Sandbox Code Playgroud)

这两个都应该返回BOOL值.这是NSObject方法的基本用法:

-(BOOL)isKindOfClass:(Class)aClass
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅此答案: 在Objective-C中,如何测试对象类型?


Jos*_*osh 8

考虑从JSON或XML响应中解析数据时的情况.根据您使用的解析库,您可能不会得到NSArrays或NSDictionaries.相反,您可能有__NSCFArray或__NSCFDictionary.

在这种情况下,检查您是否有数组或字典的最佳方法是检查它是否响应只有数组或字典才会响应的选择器:

if([unknownObject respondsToSelector:@selector(lastObject)]){

// You can treat unknownObject as an NSArray
}else if([unknownObject respondsToSelector:@selector(allKeys)]){

// You can treat unknown Object as an NSDictionary
}
Run Code Online (Sandbox Code Playgroud)

  • -1许多对象可能会响应相同的选择器,特别是像`lastObject`或`allKeys`这样的泛型.使用`isKindOfClass:`显然是处理像`NSArray`和`NSDictionary`这样的类集群的方法. (2认同)
  • 这个答案完全是无稽之谈。[myObject isKindOfClass:[NSArray class]] 确实正确回答了“myObject 的行为是否像 NSArray 一样”的问题,这就是您想要的。不存在只有 NSArray 或 NSDictionary 才会响应的选择器。在两分钟内,我可以创建一个带有实例方法“allKeys”和“lastObject”的类。或者将“allKeys”作为类别方法添加到 NSArray 中。 (2认同)