按对象数组过滤 searchController

Filter by array of Objects searchController

我创建了一个 searchController,因此我试图让它根据 UISearchController 中的文本过滤内容。我创建了一个如下所示的自定义对象。我试过使用 NSPredicate,但不断得到:

cannot convert value of type NSPredicate to expected type @noescape (organization) throws...

class Organization: Object {
    var id: Int = 0
    var name: String = ""
    var shortName: String = ""
    var image: NSData = NSData()
    var pinImage: NSData = NSData()
    let locations = List<Location>()

}

然后我的 ViewController 中有一个名为 sortedLocations 的数组,其中包含许多 Organization 个对象。

到目前为止我尝试过的:

func updateSearchResultsForSearchController(searchController: UISearchController)
{
    filteredTableData.removeAll(keepCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF.name CONTAINS[c] %@", searchController.searchBar.text!)

    let array = sortedLocations.filter(searchPredicate)
    filteredTableData = array as! [Organization]



    self.tableView.reloadData()
}

SequenceTypefilter() 方法不采用 NSPredicate 作为参数,但是 闭包,例如

let filteredTableData = sortedLocations.filter {
    [=10=].name.localizedCaseInsensitiveContainsString(searchText)
}

为每个数组元素调用闭包(这里使用 shorthand 参数 [=15=]) 和 returns truefalse 来指示元素是否 是否包含在过滤结果中。


您可以使用 NSPredicate 来过滤 NSArray,这样看起来 喜欢

let filtered = someNSArray.filteredArrayUsingPredicate(predicate)

但如果您有 Swift 数组,则没有理由使用它。