使用NSPredicates / KVC获取一组兄弟键

时间:2010-12-22 18:53:48

标签: iphone cocoa ios nspredicate key-value-coding

另一种说法可能是...

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 :(得分:0)

我只使用NSArray而不是NSDictionary,所以我不知道这有多大,但是我正在使用它:

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

其中self.tours是Tour对象的NSArray。 Tour对象具有NSString * tourCode的属性。 matchingTour属于NSArray类型。

当我读到这篇文章时,我感到非常惊讶,尝试了它并且第一次工作了,我得到了一个只包含一个游览的数组!

在“树”中,您不会显示任何属性名称“countryname” - 只是想知道。

答案 1 :(得分:0)

你几乎得到了它:

NSDictionary * lists = ...;

这是你的原始词典

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

这是从字典中检索状态数组。大概这些是实际的“状态”对象(即,你创建了一个名为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数组的顺序相同。