Как проверить, что мой nsarray содержит другой элемент nsarray или нет самым быстрым способом IOS

Я видел много ответов, но не получил своего ответа. Вот почему я решил опубликовать вопрос. Если кто-нибудь может найти полезную ссылку или ответ будет полезен. Вот мой массив словаря:

<__NSArrayM 0x283ba04e0>(
{
    failvalues =     (
        "Check 1"
    );
    fieldname = "Check 3";
    fieldvalue =     (
        "Check 1",
        "Check 2"
    );
    showtype = mandatory;
    tagvalue = 0;
},
{
    failvalues =     (
        Fail
    );
    fieldname = "Dropdown 3";
    fieldvalue =     (
        Fail
    );
    showtype = mandatory;
    tagvalue = 1;
},
{
    failvalues =     (
        "Check 1",
        "Check 4"
    );
    fieldname = "Check 4";
    fieldvalue =     (
        "Check 1",
        "Check 2"
    );
    showtype = mandatory;
    tagvalue = 2;
})  

Итак, я хочу проверить, содержит ли значение поля значения сбоя или нет. Ниже приведен код, который я пробовал, но он не работает:

for (int i = 0; i< [arrFields count]; i++) {
            if ([[[arrFields objectAtIndex:i]objectForKey:@"failvalues"] isKindOfClass:[NSArray class]]) {
                if (![[[[arrFields objectAtIndex:i] objectForKey:@"failvalues"] objectAtIndex:0] isEqualToString:@""]) {
                    NSLog(@"Field Values %@",[[arrFields objectAtIndex:i]objectForKey:@"fieldvalue"]);
                   NSArray *failValues = [[arrFields objectAtIndex:i] objectForKey:@"failvalues"];
                    for (int j = 0; j < [failValues count]; j++) {
                        if ([failValues containsObject:[[arrFields objectAtIndex:i]objectForKey:@"fieldvalue"]]) {
                            NSLog(@"Contains %@",[[arrFields objectAtIndex:i]objectForKey:@"fieldvalue"]);
                        } else {
                            NSLog(@"No fail values");
                        }
                    }
                } else {
                    NSLog(@"No Fail Fields");
                }
            } else {
                NSLog(@"Not an array");
            }
        }  

Обновлено:
Это я пробовал, но как сломать обе петли

for (int i = 0; i< [arrFields count]; i++) {
            NSArray *fieldValues = [[arrFields objectAtIndex:i]objectForKey:@"fieldvalue"];
            NSArray *failValues = [[arrFields objectAtIndex:i] objectForKey:@"failvalues"];
                if (![[[[arrFields objectAtIndex:i] objectForKey:@"failvalues"] objectAtIndex:0] isEqualToString:@""]) {
                    //NSLog(@"Field Values %@",[[arrFields objectAtIndex:i]objectForKey:@"fieldvalue"]);
                    for(NSString *value in fieldValues){
                        if ([failValues containsObject:value]) {
                            NSLog(@"Contains %@",value);
                            scanStatus = TRUE;
                            return;
                        }
                    }
                } else {
                    NSLog(@"No Fail Fields");
                }
        }

Заранее спасибо!

Что вы хотите в итоге? True/false если есть неудачные значения? Список всех неудачных значений? Только те failValues, у которых есть соответствующий fieldValue?

Larme 11.12.2020 10:40
pastebin.com/7MRFUjAU ?
Larme 11.12.2020 10:52
pastebin.com/zNMBB7ru
TienLe 11.12.2020 11:01

Если он содержит, я хочу установить одно логическое значение true и разорвать оба цикла

Mihir Oza 11.12.2020 13:15

Пожалуйста, проверьте мои обновленные вопросы. Спасибо!

Mihir Oza 11.12.2020 13:16

Название темы немного сбивает с толку, но я думаю, вам нужно что-то вроде этой.

koen 11.12.2020 21:22

Используйте быструю итерацию: for (поле в аэродромах) ... Ужасно быстрее, чем итерация вручную. И не оценивайте одно и то же выражение десять раз подряд.

gnasher729 11.12.2020 21:57

@ gnasher729 Да, спасибо, Тир предложил решение с быстрой итерацией.

Mihir Oza 15.12.2020 14:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это классический вариант использования для тех, кого боятся и боятся goto. Хорошо известно, что goto может создать катастрофически беспорядочный код, но в подобных случаях он делает вещи чище. Вы должны знать, когда использовать goto, и определенно использовать его экономно. Но вот как я напишу ваш код:

    BOOL found = NO;
    for (NSDictionary *dict in arrFields)
    {
        NSArray *fieldValues = dict[@"fieldvalue"];
        NSArray *failValues = dict[@"failvalues"];
        if (![failValues[0] isEqualToString:@""]) {
            for (NSString *value in fieldValue) {
                if ([failValues containsObject:value]) {
                    NSLog(@"Contains %@",value);
                    found = YES;
                    goto leaveLoops;
                }
            }
        }
    }
leaveLoops:
    if (found) NSLog(@"Found one.");
    else NSLog(@"Didn't find one.");

И если вы не можете заставить себя использовать goto (вы не одиноки), вот альтернатива gotoless:

    BOOL found = NO;
    for (NSDictionary *dict in arrFields)
    {
        NSArray *fieldValues = dict[@"fieldvalue"];
        NSArray *failValues = dict[@"failvalues"];
        if (![failValues[0] isEqualToString:@""]) {
            for (NSString *value in fieldValue) {
                if ([failValues containsObject:value]) {
                    NSLog(@"Contains %@",value);
                    found = YES;
                    break;
                }
            }
            if (found) break;
        }
    }
    
    if (found) NSLog(@"Found one.");
    else NSLog(@"Didn't find one.");

Привет @TyR, какой из них ты предпочитаешь? Я имею в виду производительность?

Mihir Oza 15.12.2020 08:42

Спасибо ТиР за помощь. Я думаю, что goto предпочтительнее в моем сценарии :)

Mihir Oza 15.12.2020 14:02

С точки зрения производительности между ними не будет никакой практической разницы. (компилированный вариант goto может быть быстрее на одну или две инструкции.)

TyR 15.12.2020 18:35

Другие вопросы по теме