NSPredicate检查对象的属性是否退出,如果是,则获取它

时间:2012-06-05 20:47:14

标签: objective-c cocoa-touch nsdictionary nspredicate foundation

我甚至不确定这是可能的,但如果确实如此,那肯定会有所帮助。

我有NSArrayNSDictionarie

每个字典都有某些键(显然)。

Dict{ 
 Title: WBCCount
 Cat: Lab
}
Dict{
 Title: HbM
 Cat: Lab
 Sex: Male
}
Dict{
 Title: HbF
 Cat: Lab
 Sex: Female
}
Dict{
  Title: PC_Count
  Cat: CBC
  Sex: Female
}

我希望使用Cat = 'Lab' IF Sex的字典过滤数组,因为字典对象中存在一个键,得到Male的字典

总之,我不能把它放在一起

predicateWithFormate:%@" Cat = Lab AND ( if Sex key is present, Sex = Male";

这会给我一个WBC, HbM的数组。

我不知道这是否可能,谓词中的一个条件,但如果它是通过Web API发送对象的方式,它将是一个救生员。

如果不是这样,任何其他实现目标的方式也会很棒。

虽然我们是Core Data的主题,但这应该很简单:我希望实体的属性能够存储NSDateNSNumberNSString 。有一条简单的出路吗?

2 个答案:

答案 0 :(得分:7)

这里的诀窍是,在NSDictionary中,非现有密钥只返回nil

NSArray *dictionaries = @[
    @{ @"Title": @"T1",  @"Cat":   @"Lab",   @"Sex":   @"Male"   },
    @{ @"Title": @"T2",  @"Cat":   @"C2"                         },
    @{ @"Title": @"T3",  @"Cat":   @"Lab",   @"Sex":   @"Female" },
    @{ @"Title": @"T4",  @"Cat":   @"Lab"                        }
];                    

NSPredicate *pred = [NSPredicate predicateWithFormat:@"(Sex == nil OR Sex = 'Male') AND Cat = 'Lab'" ];

NSArray *result = [dictionaries filteredArrayUsingPredicate:pred];

答案 1 :(得分:5)

用于检查密钥存在的另一种语法(但仅适用于集合)是:

NSPredicate *p = [NSPredicate predicateWithFormat:@"Sex in SELF"]

我经常在Parse.com上使用它