按对象数组过滤searchController

Pet*_*Pik 3 ios swift uisearchcontroller

我已经创建了一个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>()

}
Run Code Online (Sandbox Code Playgroud)

然后,我sortedLocations在ViewController中调用了一个数组,其中包含许多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()
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 5

filter()方法SequenceType不使用a NSPredicate 作为参数,而是使用闭包,例如

let filteredTableData = sortedLocations.filter {
    $0.name.localizedCaseInsensitiveContainsString(searchText)
}
Run Code Online (Sandbox Code Playgroud)

将为每个数组元素调用该闭包(此处使用shorthand参数$0),并返回truefalse指示该元素是否要包含在过滤结果中。


您可以使用NSPredicate过滤NSArray,看起来像

let filtered = someNSArray.filteredArrayUsingPredicate(predicate)
Run Code Online (Sandbox Code Playgroud)

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