我正在尝试使用对象中的两个实体过滤我的数组,例如我有一个 Person 对象,其中我有姓名、地址、号码、电子邮件等。我正在尝试仅使用名称和编号过滤我的对象数组列表。如何使用 NSPredicate 实现这一点?
创建谓词(下面假定您的 Person
类具有 name
和number
字符串属性(:
NSString *nameFilter = @"Steve*";
NSString *numberFilter = @"555-*";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name like %@) or (number like %@)", nameFilter, numberFilter];
然后,筛选数组(这假设您有Person
对象的NSArray
(:
NSArray *personArray = /* obtain from somewhere */;
NSArray *filtered = [personArray filteredArrayUsingPredicate:pred];
结果将是一个包含Person
对象的数组,这些对象的name
可以是"史蒂夫"、"史蒂文"等,其编号以 555-
开头。
编辑
你说的其实没有意义。不能从类中删除属性(或者更确切地说,不应该删除(。如果你只需要一个只包含名称和数字的数组,你必须遍历Person
对象的数组:
NSMutableArray *result = [NSMutableArray array];
for (Person *p in personArray)
[result addObject:[NSString stringWithFormat:"%@ : %@", [p name], [p number]]];
我相信你正在寻找:
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name==%@",name];
或者,如果您希望字符串名称相似,也可以使用:
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name like %@",name];
假设电话号码只是一个整数,您可以使用==,<,<=等进行数字比较
然后应用它:
NSArray * filteredarray = [array filteredArrayUsingPredicate:predicate];
我更喜欢使用CONTAINS
词进行过滤。做这项工作很容易。或者您可以将它们组合在一起:
NSPredicate * predicate =
[NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ OR name LIKE[cd] %@", filterName, filterName];
您可以参考官方文档:
开头:左手表达式以右手表达式开头。
包含:左侧表达式包含右侧表达式。
结束:左手表达式以右手表达式结束。
LIKE:左手表达式等于右手表达式:? 和 * 允许作为通配符,其中 ? 匹配 1 个字符,* 匹配 0 个或多个字符。
MATCHES:根据 ICU v3 使用正则表达式样式比较,左手表达式等于右手表达式(有关更多详细信息,请参阅 ICU 正则表达式用户指南(。
NSPredicate *pNewsCard = [NSPredicate predicateWithFormat:@"feedType = %@", @"NewsCard"];
NSArray *filteredNewsCard = [arrayTotalFeed filteredArrayUsingPredicate:pNewsCard];
feedType
是要比较的自定义对象的属性,arrayTotalFeed
是自定义对象的数组。