在 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
,这就是我需要查看的内容(最好是 name
和 topic
,但现在 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
变体相等。
上下文: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
,这就是我需要查看的内容(最好是 name
和 topic
,但现在 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
变体相等。