在 UITableView 的数组中从 class 中搜索 属性

Search property from class in array within UITableView

上下文: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()
}

问题:我的数据来自 class Score,其中有一个 属性 name,这就是我需要查看的内容(最好是 nametopic,但现在 name 我会很高兴)。所以 allScores as NSArray 不起作用,因为 Score 不包含文本,但 name 属性 包含文本。我怎样才能在这里实现它? allScores.name 之类的东西显然是行不通的,但我不知道如何调用数组中所有项目的名称 属性 一般。

如果你想使用 NSPredicate,从 NSObject 派生你的 Score class 并简单地在谓词中使用 属性 名称(没有 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 { [=11=].name.containsString("b") }
print(scores)

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