Charles Yeung
Charles Yeung

Reputation: 38803

Check whether an object is an NSArray or NSDictionary

As per subject, how can I check whether an object is an NSArray or NSDictionary?

Upvotes: 46

Views: 26634

Answers (4)

NRitH
NRitH

Reputation: 13893

Just in case anyone comes late to this party looking for a Swift equivalent, here you go. It's a lot more elegant than the Objective-C version, IMHO, because not only does it check the types, but it casts them to the desired type at the same time:

if let arrayVersion = obj as? NSArray {
    // arrayVersion is guaranteed to be a non-`nil` NSArray
} else if let dictionaryVersion = obj as? NSDictionary {
    // dictionaryVersion is guaranteed to be a non-`nil` NSDictionary
} else {
    // it's neither
}

Upvotes: 0

Chris Grant
Chris Grant

Reputation: 2385

Try

[myObject isKindOfClass:[NSArray class]]

and

[myObject isKindOfClass:[NSDictionary class]]

Both of these should return BOOL values. This is basic use of the NSObject method:

-(BOOL)isKindOfClass:(Class)aClass

For a bit more information, see this answer here: In Objective-C, how do I test the object type?

Upvotes: 14

Josh
Josh

Reputation: 676

Consider the case when you're parsing data from a JSON or XML response. Depending on the parsing library you are using, you may not end up with NSArrays or NSDictionaries. Instead you may have __NSCFArray or __NSCFDictionary.

In that case, the best way to check whether you have an array or a dictionary is to check whether it responds to a selector that only an array or dictionary would respond to:

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
}

Upvotes: 8

dbgrman
dbgrman

Reputation: 5681

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

Upvotes: 99

Related Questions