NSPredicate 在一些空的数组数组上
NSPredicate on array of arrays where some empty
我正在尝试过滤包含 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 查询以考虑到一些可能为空的数组?
let resultPredicate = NSPredicate(format: "SELF.@count >0 AND SELF[0].common_name contains[cd] %@", searchText)
如果您对更强类型的过滤操作感兴趣,并且您使用的是最新的 Xcode 6.3,您可以使用 flatMap
,它将执行 returns 数组上的数组,并将结果展平。然后你可以在子数组中使用过滤器:
// 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
}
}
}
我正在尝试过滤包含 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 查询以考虑到一些可能为空的数组?
let resultPredicate = NSPredicate(format: "SELF.@count >0 AND SELF[0].common_name contains[cd] %@", searchText)
如果您对更强类型的过滤操作感兴趣,并且您使用的是最新的 Xcode 6.3,您可以使用 flatMap
,它将执行 returns 数组上的数组,并将结果展平。然后你可以在子数组中使用过滤器:
// 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
}
}
}