如何在对象属性上使用谓词过滤NSArray

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { [self.map removeAnnotations:self.map.annotations]; if ([textField isEqual:self.searchText]) { NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"name contains[c], %@",self.searchText.text]; self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:bPredicate]; NSLog(@" HEARE %@",self.filteredArray); [self markAllHotels]; } return YES; } 

hotelArrayfilteredArrayNSArray

hotelArrayhoteltypes的hotel ,有一个酒店name

问题:当hotel.name匹配在hotel.name [文本字段]中input的文本时,我想根据hotel.name过滤hotelArray ,但是我得到一个空的self.filteredArray

尝试以下几行,确保properyName区分大小写。 而且你已经以谓词格式,这就是为什么它不工作。 用下面的代码replace你的代码。

目标C

 NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF.name contains[cd] %@",self.searchText.text]; self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:bPredicate]; NSLog(@"HERE %@",self.filteredArray); 

迅速

 var bPredicate: NSPredicate = NSPredicate(format: "SELF.name contains[cd] %@", self.searchText.text) self.filteredArray = self.hotelArray.filteredArrayUsingPredicate(bPredicate) NSLog("HERE %@", self.filteredArray) 

使用swift filter

 var searchText = "Galaxy" let filteredArray = hotelArray.filter { $0["name"] == searchText } print("** Result ** \n\(filteredArray)") 

Swift 3.0

 let arrEmp = [["name": "James", "age" : 27, "city" : "New york"], ["name": "Johnson", "age" : 24, "city" : "London"], ["name": "Alex", "age" : 28, "city" : "Newark"], ["name": "Mark", "age" : 25, "city" : "Paris"], ["name": "Steve", "age" : 25, "city" : "Silicon Valley"], ["name": "Lary", "age" : 28, "city" : "New york"]] // *** Filter by Name exact match *** var filterByName = arrEmp.filter { $0["name"] == "Mark" } print("filterByName \(filterByName)") // *** Filter by Age *** var filterByAge = arrEmp.filter { $0["age"] as! Int > 25 } print("filterByAge \(filterByAge)") 

Swift 4.0

 var filterByName = arrEmp.filter do { $0["name"] == "Mark" } print("filterByName filterByName)") var filterByAge = arrEmp.filter do { $0["age"] as! Int > 25 } print("filterByAge filterByAge)") 

根据您的信息,这是你的情况:

 self.hotelArray // Array in which we perform a search self.filteredArray // Result array name // Property of the object used for the predicate 

这个谓词应该适合你:

 NSString *searchText = self.searchText.text; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name contains[c] %@", searchText]; self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:predicate]; 

这是可能适合你的谓词方法。

 -(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope { [filteredContactArray removeAllObjects]; NSArray *tempArray = [hotelArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name contains[c] %@ OR name contains[cd] %@",searchText]]; filteredArray = [NSMutableArray arrayWithArray:tempArray];//if you want the filtered array to be mutable or tempArray will work as as desired by you. } 

包含[c] – 表示区分大小写的谓词。 包含[cd] – 不区分大小写的string

结帐这个库

https://github.com/BadChoice/Collection

它带有许多简单的数组函数,永远不会再写一个循环

所以你可以做:

 NSArray* hotels = [self.hotelArray filter:^BOOL(Hotel *hotel) { [return hotel.name isEqualToString:searchText]; }]; 

或干脆

 NSArray* hotels = [self.hotelArray where:@"name" is:searchText]; 

🙂

我不确定这是你想做的事情:

 -(NSArray*)searchString:(NSString*)stringToSearch inArray:(NSArray*)myArray { NSMutableArray* filtredArray = [[NSMutableArray alloc] init]; for (NSString* elmnt in myArray) { if ([elmnt rangeOfString:stringToSearch].location != NSNotFound) [fitredArray addObject:elmnt]; } return filtredArray; }