我正在尝试过滤包含Bird类型的核心数据实体的数组数组。基于具有节和行的UITableView,实体已被拆分为数组数组。
要搜索我根据此问题NSPredicate on array of arrays获得以下方法:
func filterContentForSearchText(searchText: String) {
let resultPredicate = NSPredicate(format: "SELF[0].common_name contains[cd] %@", searchText)
self.filteredBirds = self.birds.filteredArrayUsingPredicate(resultPredicate!)
}
然而,这会导致错误
Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array'
这可能有意义,因为数组有27个(A-Z,#)元素,其中一些没有实体
那么,如何调整NSPredicate查询以考虑某些数组可能为空?
答案 0 :(得分:3)
let resultPredicate = NSPredicate(format: "SELF.@count >0 AND SELF[0].common_name contains[cd] %@", searchText)
答案 1 :(得分:0)
如果您对更强类型的过滤操作感兴趣,并且您正在使用最新的Xcode 6.3,则可以使用flatMap
,它将执行返回数组数组上的数组的映射操作,并使结果变平。然后你可以在子数组中使用过滤器:
// assuming birds is an NSArray containing NSArrays of Bird
if let arrayOfArrays = birds as? [[Bird]] {
let filteredBirds = arrayOfArrays.flatMap { birds in
birds.filter { bird in
bird.common_name.rangeOfString(searchText) != nil
}
}
}