Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple methods named "count" found with mismatched result, parameter type or attributes

Since the update to Xcode 5.1 I can't archive my project any more. Xcode always says "Multiple methods named "count" found with mismatched result, parameter type or attributes. This problem is new and simulator and running on device works fine. Here is the code:

    for ( int i = 0; i<[parseJSONArray count];i++){
        for (int j = 0; j<[JSON[@"data"][@"menu"][i][@"item"] count];j++){
            [pictureURL addObject:JSON[@"data"][@"menu"][i][@"item"][j][@"image"]];
        }
    }

Xcode shows the error at this point : [JSON[@"data"][@"menu"][i][@"item"] count] JSON is a NSDictionary. Whats wrong with this?

like image 809
seniorbenelli Avatar asked Mar 10 '14 23:03

seniorbenelli


4 Answers

Ask yourself: What is the type of JSON[@"data"][@"menu"][i][@"item"] ? It is "id". The compiler doesn't know which method this object responds to. You send a "count" message. The compiler goes through all the count methods of all classes that it knows about. If there are more than two different ones, it has to complain.

You could write

NSDictionary* data = JSON [@"data"];
NSArray* menu = data [@"menu"];
NSDictionary* menuI = menu [i];
NSArray* item = menuI [@"item"];

for (NSDictionary* picture in item)
    [pictureURL addObject:picture [@"image"];

More readable, easier to follow, runs faster, and easier to debug.

Of course you can also write

for (NSUInteger j = 0; j < item.count; ++j)
{
    NSDictionary* picture = item [i];
    [pictureURL addObject:picture [@"image"];
}
like image 182
gnasher729 Avatar answered Nov 16 '22 03:11

gnasher729


Since there are multiple Cocoa classes with a method named count, and objectForKeyedSubscript: (to which JSON[@"data"][@"menu"][i][@"item"] resolves) returns id, the compiler can't do the typechecking it wants to do for the message send.

To stop the warning, you'll need to cast the result of JSON[@"data"][@"menu"][i][@"item"] to its actual class e.g., (NSDictionary *)(JSON[@"data"][@"menu"][i][@"item"]), or put it into a temporary variable: NSDictionary * itemDict = JSON[@"data"][@"menu"][i][@"item"];

like image 41
jscs Avatar answered Nov 16 '22 03:11

jscs


Try:

[[[[[JSON objectForKey:@"data"] objectForKey:@"menu"] objectAtIndex: i] objectForKey:@"item"] count];

That help?

like image 41
Joey Clover Avatar answered Nov 16 '22 02:11

Joey Clover


Just a cast like:

float a = [[_myArray objectForKey:@"myKey"] count] / 5.0;

float a = [(NSArray *)[_myArray objectForKey:@"myKey"] count] / 5.0;

like image 39
Mário Carvalho Avatar answered Nov 16 '22 02:11

Mário Carvalho