按对象数组过滤 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()
}
SequenceType
的 filter()
方法不采用 NSPredicate
作为参数,但是 闭包,例如
let filteredTableData = sortedLocations.filter {
[=10=].name.localizedCaseInsensitiveContainsString(searchText)
}
为每个数组元素调用闭包(这里使用 shorthand
参数 [=15=]
) 和 returns true
或 false
来指示元素是否
是否包含在过滤结果中。
您可以使用 NSPredicate
来过滤 NSArray
,这样看起来
喜欢
let filtered = someNSArray.filteredArrayUsingPredicate(predicate)
但如果您有 Swift 数组,则没有理由使用它。
我创建了一个 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()
}
SequenceType
的 filter()
方法不采用 NSPredicate
作为参数,但是 闭包,例如
let filteredTableData = sortedLocations.filter {
[=10=].name.localizedCaseInsensitiveContainsString(searchText)
}
为每个数组元素调用闭包(这里使用 shorthand
参数 [=15=]
) 和 returns true
或 false
来指示元素是否
是否包含在过滤结果中。
您可以使用 NSPredicate
来过滤 NSArray
,这样看起来
喜欢
let filtered = someNSArray.filteredArrayUsingPredicate(predicate)
但如果您有 Swift 数组,则没有理由使用它。