如何使用NSPredicate搜索对象?

时间:2018-03-04 23:21:22

标签: ios swift uisearchbar nspredicate

在Nsarray中,我需要过滤包含searchKey的所有元素(例如39013)。现在,它返回了错误的值。我的搜索功能出了什么问题?我认为问题出在FORMAT行,但无法弄清楚要做什么?

要求:搜索栏必须搜索在LocationModel对象中声明的DesenNo中的值。

这是对象

import UIKit

class LocationModel: NSObject {
    //properties
    var DesenNo: String?
    var Dolar: String?
    var Zemin: String?
    var En: String?
    var Euro: String?
    var Renk: String?
}

这是我的搜索功能:

func updateSearchResults(for searchController: UISearchController) {
    if searchController.isActive {
        filteredData.removeAll(keepingCapacity: false)
        let searchPredicate = NSPredicate(format: "LocationModel.DesenNo CONTAINS[c] %@", searchController.searchBar.text!)

        let array = self.feedItems.filter { searchPredicate.evaluate(with: ($0 as! LocationModel).DesenNo) }

        let filterArray = array.map {($0 as! LocationModel).DesenNo}
        filteredData = filterArray as! [String]
        listTableView.reloadData()
    } else {
        filteredData.removeAll(keepingCapacity: false)
        listTableView.reloadData()
    }
}

1 个答案:

答案 0 :(得分:0)

你不需要谓词。只需使用一个简单的Swift数组过滤器:

假设document.getElementById("car_count").innerHTML = count ; 被声明为self.feedItems,您只需要:

[LocationModel]

如果您希望将这些结果简化为相应的let matchingModels = self.feedItems.filter { $0.DesenNo?.contains(searchController.searchBar.text!) } 值列表,请执行:

DesenNo

作为旁注,您的filteredData = matchingModels.map { $0.DesenNo } 课程无需延长LocationModel。它也应该是NSObject,而不是struct

另请注意,标准做法是变量和方法名称以小写字母开头。类和结构名称以大写字母开头。

class

如果您出于某种原因确实想使用func updateSearchResults(for searchController: UISearchController) { if searchController.isActive { let matchingModels = self.feedItems.filter { $0.DesenNo?.contains(searchController.searchBar.text!) } filteredData = matchingModels.map { $0.DesenNo } listTableView.reloadData() } else { filteredData.removeAll(keepingCapacity: false) listTableView.reloadData() } } ,可以将代码更新为:

NSPredicate

如果func updateSearchResults(for searchController: UISearchController) { if searchController.isActive { let searchPredicate = NSPredicate(format: "DesenNo CONTAINS[c] %@", searchController.searchBar.text!) let array = self.feedItems.filter { searchPredicate.evaluate(with: $0) } filteredData = array.map { $0.DesenNo } listTableView.reloadData() } else { filteredData.removeAll(keepingCapacity: false) listTableView.reloadData() } } 实际上是self.feedItems而不是正确的Swift数组,请更改:

NSArray

为:

... = self.feedItems.filter { ...