NSPredicate数组的数组,其中一些空

时间:2015-03-14 12:31:40

标签: ios objective-c arrays swift nspredicate

我正在尝试过滤包含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查询以考虑某些数组可能为空?

2 个答案:

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