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
        }
    }
}