NSArray из многих NSDictionary.Каков наилучший способ найти NSDictionary с необходимым значением для данного ключа? - PullRequest
6 голосов
/ 08 июля 2011

Сейчас я пробую следующее, и это работает.


    - (void)findDictionaryWithValueForKey:(NSString *)name {

         for (NSDictionary * set in myArray) {

            if ([[set objectForKey:@"title"] isEqualToString:name]) 
               \\do something

         }

    }

РЕДАКТИРОВАТЬ: Я добавил один дополнительный аргумент к сообщению bshirley .Теперь это выглядит более гибким.



- (NSDictionary *)findDictionaryWithValue:(NSString*)name forKey:(NSString *)key {

    __block BOOL found = NO;
    __block NSDictionary *dict = nil;

    [self.cardSetsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        dict = (NSDictionary *)obj;
        NSString *title = [dict valueForKey:key];
        if ([title isEqualToString:name]) {
            found = YES;
            *stop = YES;
        }
    }];

    if (found) {
        return dict;
    } else {
        return nil;
    }

}

Ответы [ 4 ]

8 голосов
/ 08 июля 2011

Вот одна из возможных реализаций с использованием более нового API.(Я также изменил метод, чтобы фактически вернуть значение).Предоставляется в основном для демонстрации этого API.Предполагается, что заголовок уникален для одного словаря в вашем массиве.

- (NSDictionary *)findDictionaryWithValueForKey:(NSString *)name {
  // ivar: NSArray *myArray;
  __block BOOL found = NO;
  __block NSDictionary *dict = nil;

  [myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    dict = (NSDictionary *)obj;
    NSString *title = [dict valueForKey:@"title"];
    if ([title isEqualToString:name]) {
      found = YES;
      *stop = YES;
    }
  }];

  if (found) {
    return dict;
  } else {
    return nil;
  }

}
8 голосов
/ 08 июля 2011

Используйте filteredArrayUsingPredicate: метод массива, чтобы получить все словари, которые удовлетворяют вашему требованию.

NSPredicate * predicate = [NSPredicate predicateWithFormat:@" title MATCHES[cd] %@", name];
NSArray * matches = [myArray filteredArrayUsingPredicate:predicate];

Теперь matches - это массив словарей с ключом title, равным name.

0 голосов
/ 08 июля 2011
    - (void)findDictionaryWithValueForKey:(NSString)name {

        for (NSDictionary * set in myArray) {


            NSString *s=[NSString stringWithFormat:@"%@",[set objectForKey:@"title"]];
            if ([s isEqualToString:name]) 
                \\do something

            }

            OR 
            if (s == name]) 
                \\do something

            }



    }
0 голосов
/ 08 июля 2011

Я также предложу этот способ, было бы лучше, если бы вы использовали оператор break,

- (void)findDictionaryWithValueForKey:(NSString)name {

     for (NSDictionary * set in myArray) {

        if ([[set objectForKey:@"title"] isEqualToString:name]) 
           \\do something
           break;
     }

}

Согласно документации NSArray,

valueForKey:

Returns an array containing the results of invoking valueForKey: using key on each of the array's objects.
- (id)valueForKey:(NSString *)key
Parameters

key

    The key to retrieve.

Return Value

The value of the retrieved key.
Discussion

The returned array contains NSNull elements for each object that returns nil.
Availability

    * Available in Mac OS X v10.3 and later.

EDIT:

попробуйте это,

[myArray valueForKey:@"name"];

// это вернет массив значений, но на самом деле это отличается от того, что нужно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...