从UITableView中的数组中的类中搜索属性

时间:2015-09-26 12:48:34

标签: arrays swift uitableview nsarray uisearchcontroller

上下文:Swift,iOS8-9,UITableView,UISearchController。 基于此示例的代码:http://www.ioscreator.com/tutorials/add-search-table-view-tutorial-ios8-swift

func updateSearchResultsForSearchController(searchController: UISearchController) {
    filteredTableData.removeAll(keepCapacity: false)
    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
    let scores = (allScores as NSArray).filteredArrayUsingPredicate(searchPredicate)
    filteredTableData = scores as! [Score]
    tableView.reloadData()
}

问题:我的数据来自类Score,其中包含属性name,这就是我需要查看的内容(理想情况为nametopic,但是name我现在很开心)。因此allScores as NSArray不起作用,因为Score不包含文本,但name属性包含文本。我怎么能在这里实现呢?像allScores.name这样的东西显然不起作用,但我不知道如何调用数组中所有项的name属性。

1 个答案:

答案 0 :(得分:1)

如果您想使用NSPredicate,请从Score派生您的NSObject课程,只需在谓词中使用属性名称(无需SELF)。

class Score: NSObject {
    var name: String

    init(name: String) {
        self.name = name
    }

    override var description: String {
        return self.name
    }
}

let allScores = [Score(name: "a"), Score(name: "ab"), Score(name: "b")]
let searchPredicate = NSPredicate(format: "name CONTAINS[c] %@", "b")
let scores = (allScores as NSArray).filteredArrayUsingPredicate(searchPredicate)
print(scores)

以上代码段在控制台上打印[ab, b]

但是,使用Swift的filter方法可以获得完全相同的结果。

let allScores = [Score(name: "a"), Score(name: "ab"), Score(name: "b")]
let scores = allScores.filter { $0.name.containsString("b") }
print(scores)

此代码段再次在控制台上打印[ab, b],表明它与NSPredicate变体的相等性。