[英]Filter on NSMutableArray with NSPredicate - Return No result
[英]NSMutableArray and NSPredicate filtering
我试图用一个对象中的两个实体来过滤我的数组,就像我有一个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
可以是“Steve”,“Steven”等,其编号以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];
假设电话号码只是一个int,您可以使用==,<,<=等进行数字比较
然后应用它:
NSArray * filteredarray = [array filteredArrayUsingPredicate:predicate];
我更喜欢使用CONTAINS
字来进行过滤。 这项工作很容易。 或者你可以将它们组合在一起:
NSPredicate * predicate =
[NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ OR name LIKE[cd] %@", filterName, filterName];
你可以参考官方DOC :
BEGINSWITH:左手表达式以右手表达式开头。
CONTAINS:左手表达式包含右手表达式。
ENDSWITH:左手表达式以右手表达式结束。
LIKE:左手表达式等于右手表达式:? 和*被允许作为通配符,在哪里? 匹配1个字符,*匹配0个或更多个字符。
匹配:根据ICU v3,左手表达式使用正则表达式比较等于右手表达式(有关详细信息,请参阅ICU用户指南中的正则表达式)。
NSPredicate *pNewsCard = [NSPredicate predicateWithFormat:@"feedType = %@", @"NewsCard"];
NSArray *filteredNewsCard = [arrayTotalFeed filteredArrayUsingPredicate:pNewsCard];
feedType
是要比较的Custom对象的属性, arrayTotalFeed
是Custom对象的数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.