Вопрос по objective-c, compiler-warnings, cocoa-touch – Найдено несколько методов с именем «count» с несоответствующим результатом, типом параметра или атрибутами

8

После обновления до Xcode 5.1 я больше не могу архивировать свой проект. Xcode всегда говорит: «Несколько методов с именем« count »найдено с несоответствующим результатом, типом параметра или атрибутами. Эта проблема является новой, и симулятор работает на устройстве нормально». Вот код:

    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 показывает ошибку в этой точке:[JSON[@"data"][@"menu"][i][@"item"] count] JSON этоNSDictionary, Что не так с этим?

возможный дубликатНесколько методов предупреждения Josh Caswell

Ваш Ответ

6   ответов
1

Пытаться:

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

Это поможет?

Нет, это не помогает, проблема кажется мне очень странной, пришла с обновлением. seniorbenelli
0

попробуй вот так

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

вам нужно пройти

,

parseJSONArray

тип NSArray

1

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

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

0

@interface NSArray ()
- (NSUInteger) arrayElementCount;
@end

@implementation NSArray()
- (NSUInteger) arrayElementCount {
    return [self count];
}
@end

Использование arrayElementCount вместо 'count'

16

data"] [@ "menu"] [i] [@ "item"]? Это «id». Компилятор не знает, на какой метод отвечает этот объект. Вы отправляете сообщение «считать». Компилятор просматривает все методы count всех классов, о которых он знает. Если есть более двух разных, он должен жаловаться.

Вы могли бы написать

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"];

Более удобочитаем, понятен, работает быстрее и легче отлаживается.

Конечно, вы также можете написать

for (NSUInteger j = 0; j < item.count; ++j)
{
    NSDictionary* picture = item [i];
    [pictureURL addObject:picture [@"image"];
}
Это теряет основную концепцию OOPS. Одна и та же сигнатура метода может присутствовать в нескольких объектах. Praveen Matanam
Очень хороший момент о прямой итерации, а не индексации. Определенно путь. Josh Caswell
Интересно. Но если это так, то он найдет несколько методов с одной и той же сигнатурой (с одинаковым аргументом и типом возвращаемого значения), но которые делают разные вещи. Вещи могут не включать вещи, которые делает только конкретный объект, о котором идет речь (что может помочь в определении того, что этоid имеет в виду), но сказать что-то общее, как печать строки. Скажем, метод одного класса печатаетFooи еще один печатаетбу, Как это будет дифференцироваться? SexyBeast
Спасибо!!! seniorbenelli
2

count, а такжеobjectForKeyedSubscript: (которомуJSON[@"data"][@"menu"][i][@"item"] решает) возвращаетid, компилятор не может выполнить проверку типов, которую он хочет сделать для отправки сообщения.

Чтобы остановить предупреждение, вам нужно привести результатJSON[@"data"][@"menu"][i][@"item"] к его фактическому классу, например,(NSDictionary *)(JSON[@"data"][@"menu"][i][@"item"])или поместите его во временную переменную:NSDictionary * itemDict = JSON[@"data"][@"menu"][i][@"item"];

Ах, хорошо! Я никогда не знал этого. Удобная информация прямо там :) Joey Clover
Не уверен, @seniorbenelli. Компилятор должен был предупредить об этом раньше. Josh Caswell
Спасибо, мужик!! Но почему эта проблема появилась с Xcode 5.1? seniorbenelli

Похожие вопросы