Я видел много ответов, но не получил своего ответа. Вот почему я решил опубликовать вопрос. Если кто-нибудь может найти полезную ссылку или ответ будет полезен. Вот мой массив словаря:
<__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 и разорвать оба цикла
Пожалуйста, проверьте мои обновленные вопросы. Спасибо!
Название темы немного сбивает с толку, но я думаю, вам нужно что-то вроде этой.
Используйте быструю итерацию: for (поле в аэродромах) ... Ужасно быстрее, чем итерация вручную. И не оценивайте одно и то же выражение десять раз подряд.
@ gnasher729 Да, спасибо, Тир предложил решение с быстрой итерацией.
Это классический вариант использования для тех, кого боятся и боятся 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, какой из них ты предпочитаешь? Я имею в виду производительность?
Спасибо ТиР за помощь. Я думаю, что goto предпочтительнее в моем сценарии :)
С точки зрения производительности между ними не будет никакой практической разницы. (компилированный вариант goto может быть быстрее на одну или две инструкции.)
Что вы хотите в итоге?
True
/false
если есть неудачные значения? Список всех неудачных значений? Только теfailValues
, у которых есть соответствующийfieldValue
?