2016-12-16 4 views
0

Я новичок в iOS и немного слаб в логике.Невозможно получить всю строку соответствия из NSDictionary iOS

Может ли один помочь мне здесь,

Я хочу, чтобы получить все данные, совпадающие с NSDictionary.

например:

мой tempDict является NSDictionary, который содержит это,

tempDict:

errorCode = 00; 
errorMessage = "<null>"; 
pastConsultations =  (

      { 
     date = "16 December 2016"; 
     day = Friday; 
     doctorName = "<null>"; 
     localTime = "07:30 AM"; 
     symptoms = q; 
     today = Yes; 
    }, 
      { 
     date = "16 December 2016"; 
     day = Friday; 
     doctorName = "<null>"; 
     localTime = "07:30 AM"; 
     symptoms = g; 
     today = Yes; 
    }, 
      { 
     date = "13 December 2016"; 
     day = Tuesday; 
     doctorName = "<null>"; 
     localTime = "12:30 PM"; 
     symptoms = fever; 
     today = No; 
    } 
); 
upcomingConsultations =  (
      { 
     date = "16 December 2016"; 
     day = Friday; 
     localTime = "09:30 PM"; 
     symptoms = ""; 
     today = Yes; 
    }, 
      { 
     date = "16 December 2016"; 
     day = Friday; 
     localTime = "09:30 PM"; 
     symptoms = chj; 
     today = Yes; 
    }, 
      { 
     date = "18 December 2016"; 
     day = Sunday; 
     localTime = "12:30 PM"; 
     symptoms = "test an incoming "; 
     today = No; 
    } 
); 
} 

Внутри pastConsultations ключ я хочу, чтобы получить все вложенные данные, которые содержит AM

т.е. мой выпуск должен быть:

{ //Array at 0th index 
      date = "16 December 2016"; 
      day = Friday; 
      doctorName = "<null>"; 
      localTime = "07:30 AM"; 
      symptoms = q; 
      today = Yes; 
     }, 
       { //Array at 1st index 
      date = "16 December 2016"; 
      day = Friday; 
      doctorName = "<null>"; 
      localTime = "07:30 AM"; 
      symptoms = g; 
      today = Yes; 
     } 
} 

Вот код, который я пробовал, но он не работает, пожалуйста, помогите, где я делаю ошибку?

NSArray *allKeys; 
     for (int i=0; i<[tempDict count]; i++) { 
      allKeys = [[[tempDict valueForKey:@"upcomingConsultations"] objectAtIndex:i] allKeys]; 



      NSString *targetKey = nil; 
      // NSArray *allKeys = [[tempDict valueForKeyPath:@"pastConsultations"] allKeys]; 
      for (int j = 0; j < [allKeys count]; ++j) { 
       NSString *key = [allKeys objectAtIndex:i]; 
       NSString *obj = [[[tempDict valueForKey:@"upcomingConsultations"] objectAtIndex:i] objectForKey:key]; 
       if ([obj rangeOfString:searchText].location != NSNotFound) { // searchedString is what you're looking for 
        targetKey = key; 
        NSLog(@"found match"); 
        break; 
       } 
      } 
     } 
+0

Есть ли какие-либо ошибки или вы не получаете результат? –

+0

не получается результат –

ответ

1

Попробуйте этот код:

если вы уже имеете словарь tempDict загружен.

NSMutableArray *morningPastArr = [[NSMutableArray alloc] init]; 

NSArray *pastArray = [tempDict objectForKey:@"pastConsultations"]; 
for (int i=0;i<[pastArray count]; i++) { 
    NSDictionary *eachPast = [pastArray objectAtIndex:i]; 
    NSString *time = [eachPast objectForKey:@"localTime"]; 
    if (![time rangeOfString:@"AM"].location == NSNotFound) { 
    [morningPastArr addObject:eachPast]; 
    } 
} 

// finally you will have like what you need in morningPastArr. 

EDIT: Если вы хотите объединить результаты поиска, например, результаты для ввода AM и пятницу только вы можете сделать так:

NSMutableArray *morningAndFridayPastArr = [[NSMutableArray alloc] init]; 

NSArray *pastArray = [tempDict objectForKey:@"pastConsultations"]; 
for (int i=0;i<[pastArray count]; i++) { 
    NSDictionary *eachPast = [pastArray objectAtIndex:i]; 
    NSString *time = [eachPast objectForKey:@"localTime"]; 
    NSString *day = [eachPast objectForKey:@"day"]; 
    if ((![time rangeOfString:@"AM"].location == NSNotFound)&&([day isEqualToString:@"Friday"])) { 
    [morningAndFridayPastArr addObject:eachPast]; 
    } 
} 
+0

Зачем использовать цикл? предикат более эффективен. –

+0

Да, я согласен. Ваш код более эффективен. Но я не такой профессиональный, как ты. Мой код, как правило, легче понять новичкам (как и я). Я сожалею, что написал длинный код. – GeneCode

+1

Это работает гладко, я новичок в iOS, я не знаю о предикате. можете ли вы сказать, как мне достичь этого с помощью предиката? –

0

Вы можете использовать NSPredicate для этого следующим образом:

NSPredicate *predicate; 
NSMutableArray *filteredData=[[NSMutableArray alloc]init]; 

predicate = [NSPredicate predicateWithFormat:@"localTime contains[c] %@",@"AM"]; 
//OR Use below predicate as suggested by Rishi 
predicate = [NSPredicate predicateWithFormat:@"localTime ENDSWITH 'AM'"]; 

filteredData=[[[tempDict valueForKey:@"pastConsultations"] filteredArrayUsingPredicate:predicate]] mutableCopy]; 

Надеюсь, это поможет.

+0

Он возвращает Empty '' filteredData –

+0

Проверьте отредактированный ответ, а также проверить, если 'tempDict' не' nil' @ Appledeveloper –

+0

Я до сих пор получает 'filteredData' в ноль также проверяется' tempDict' не ноль –

Смежные вопросы