Используйте NSPredicates / KVC, чтобы получить массив ключей одного уровня - PullRequest
2 голосов
/ 22 декабря 2010

Другим способом обозначения этого может быть ...

NSPredicate "state.country == 'United States'"

похоже на

SQL "Select * from state where state.country = 'United States'

так как мне сделать это как предикат?

SQL "Select state.name from state where state.county = 'United States'"

ОРИГИНАЛЬНЫЙ ПОСТ:

У меня есть словарь массивов словарей, который выглядит следующим образом:

lists
  states
    state
    country
  country
    country

У меня есть код для фильтрации состояний по стране.Тем не менее, держу пари, что есть более чистый способ.

NSArray *states = [lists valueForKey:@"states"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"countryname == %@", selectedCountry];
states = [states filteredArrayUsingPredicate:predicate];
states = [states valueForKeyPath:@"state"];

Идеи?

Ответы [ 2 ]

0 голосов
/ 05 января 2011

Вы почти поняли:

NSDictionary * lists = ...;

Это ваш оригинальный словарь

NSArray *states = [lists objectForKey:@"states"];

Это для получения массива состояний из вашего словаря. Предположительно это фактические объекты "State" (т. Е. Вы создали класс с именем State)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"countryname == %@", selectedCountry];

Это создает предикат, который сравнивает результаты -[State countryname] со значением, на которое ссылается переменная selectedCountry. В качестве альтернативы, если массив states содержит словари, результаты сравнения -[NSDictionary objectForKey:@"countryname"] будут сравниваться со значением, на которое ссылается selectedCountry.

states = [states filteredArrayUsingPredicate:predicate];

Это извлечет все состояния из массива, где [[aState countryname] isEqual:selectedCountry]

states = [states valueForKeyPath:@"name"];

Это создаст новый массив, содержащий имя каждого состояния. Этот новый массив будет в том же порядке, что и ваш отфильтрованный массив states.

0 голосов
/ 05 января 2011

Я использую только NSArray, а не NSDictionary, поэтому я не знаю, насколько это полезно, но я использую это:

matchingTour = [self.tours filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"tourCode == %@", tourCode]];

, где self.tours - NSArray объектов Tour.Объект Tour имеет свойство NSString * tourCode.matchTour имеет тип NSArray.

Я был поражен, когда прочитал об этом, попробовал, и это сработало в первый раз, и я получил массив, содержащий только один тур!

В вашем дереве'вы не показываете имя свойства' countryname '- просто интересно.

...