在Swift中,如何在struct对象数组组成的字典中查找?
In Swift, how to search in a dictionary composed by an array of a struct object?
我有一个结构:
struct AlimentObject {
var id = UUID().uuidString
var nomAliment = "Nouvel aliment"
var poids : Float = 100
var calories : Float = 0
}
和AlimentObjet组成的数组:
var filteredData: [AlimentObject]!
我有一个 table 视图的搜索栏,但我不知道如何搜索“nomAliment”中的字符
这是搜索栏的代码:
extension AjoutAlimentController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredData = []
for aliment in data {
if aliment.nomAliment.lowercased().contains(searchText.lowercased) {
filteredData.append(aliment)
}
}
self.tableView.reloadData()
}
}
错误提示:类型 '() -> String' 不能符合 'StringProtocol';只有 struct/enum/class 类型可以符合协议
它在行中:
if aliment.nomAliment.lowercased().contains(searchText.lowercased) {
您在第二个 lowercased
之后缺少 ()
,因此您没有执行 lowercased
函数并将返回的字符串传递给 contains()
,而是传递在类型为 '() -> String' 的函数中。
简单来说,解决方案是:
if aliment.nomAliment.lowercased().contains(searchText.lowercased()) {
此外,我建议使用函数式过滤方法
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
var filteredData = data.filter { [=10=].nomAliment.contains(searchText.lowercased()) }
self.tableView.reloadData()
}
首先,永远不要将过滤数据的数组声明为隐式解包可选,将其声明为non-optional空数组
var filteredData = [AlimentObject]()
其次——因为其他答案已经描述了缺少的括号——filter
和 range(of:
) 使用 caseInsensitive
选项比使用循环和 [=19] 更有效=]小写 每一项。
extension AjoutAlimentController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
filteredData.removeAll()
} else {
filteredData = data.filter{[=11=].nomAliment.range(of: searchText, options: .caseInsensitive) != nil}
}
self.tableView.reloadData()
}
}
我有一个结构:
struct AlimentObject {
var id = UUID().uuidString
var nomAliment = "Nouvel aliment"
var poids : Float = 100
var calories : Float = 0
}
和AlimentObjet组成的数组:
var filteredData: [AlimentObject]!
我有一个 table 视图的搜索栏,但我不知道如何搜索“nomAliment”中的字符 这是搜索栏的代码:
extension AjoutAlimentController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredData = []
for aliment in data {
if aliment.nomAliment.lowercased().contains(searchText.lowercased) {
filteredData.append(aliment)
}
}
self.tableView.reloadData()
}
}
错误提示:类型 '() -> String' 不能符合 'StringProtocol';只有 struct/enum/class 类型可以符合协议 它在行中:
if aliment.nomAliment.lowercased().contains(searchText.lowercased) {
您在第二个 lowercased
之后缺少 ()
,因此您没有执行 lowercased
函数并将返回的字符串传递给 contains()
,而是传递在类型为 '() -> String' 的函数中。
简单来说,解决方案是:
if aliment.nomAliment.lowercased().contains(searchText.lowercased()) {
此外,我建议使用函数式过滤方法
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
var filteredData = data.filter { [=10=].nomAliment.contains(searchText.lowercased()) }
self.tableView.reloadData()
}
首先,永远不要将过滤数据的数组声明为隐式解包可选,将其声明为non-optional空数组
var filteredData = [AlimentObject]()
其次——因为其他答案已经描述了缺少的括号——filter
和 range(of:
) 使用 caseInsensitive
选项比使用循环和 [=19] 更有效=]小写 每一项。
extension AjoutAlimentController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
filteredData.removeAll()
} else {
filteredData = data.filter{[=11=].nomAliment.range(of: searchText, options: .caseInsensitive) != nil}
}
self.tableView.reloadData()
}
}