上下文: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
,这就是我需要查看的内容(理想情况为name
和topic
,但是name
我现在很开心)。因此allScores as NSArray
不起作用,因为Score
不包含文本,但name
属性包含文本。我怎么能在这里实现呢?像allScores.name
这样的东西显然不起作用,但我不知道如何调用数组中所有项的name属性。
答案 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
变体的相等性。