在 Swift 中,如何在由结构对象数组组成的字典中进行搜索?
Posted
技术标签:
【中文标题】在 Swift 中,如何在由结构对象数组组成的字典中进行搜索?【英文标题】:In Swift, how to search in a dictionary composed by an array of a struct object? 【发布时间】:2020-09-11 18:07:23 【问题描述】:我有一个结构:
struct AlimentObject
var id = UUID().uuidString
var nomAliment = "Nouvel aliment"
var poids : Float = 100
var calories : Float = 0
还有一个由 AlimentObjet 组成的数组:
var filteredData: [AlimentObject]!
我有一个表格视图的搜索栏,但我不知道如何搜索“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';只有结构/枚举/类类型可以符合协议 它在行中:
if aliment.nomAliment.lowercased().contains(searchText.lowercased)
【问题讨论】:
【参考方案1】:您在第二个lowercased
之后缺少()
,因此不是执行lowercased
函数并将返回的字符串传递给contains()
,而是传入一个类型为'() 的函数 - > 字符串'。
简单来说,解决方法是:
if aliment.nomAliment.lowercased().contains(searchText.lowercased())
【讨论】:
【参考方案2】:首先永远不要将过滤数据的数组声明为隐式解包可选,将其声明为非可选空数组
var filteredData = [AlimentObject]()
其次——因为其他答案已经描述了缺少的括号——filter
和 range(of:
) 与 caseInsensitive
选项比使用循环和小写每个项目更有效。
extension AjoutAlimentController: UISearchBarDelegate
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
if searchText.isEmpty
filteredData.removeAll()
else
filteredData = data.filter$0.nomAliment.range(of: searchText, options: .caseInsensitive) != nil
self.tableView.reloadData()
【讨论】:
【参考方案3】:另外,我建议使用函数式过滤方法
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
var filteredData = data.filter $0.nomAliment.contains(searchText.lowercased())
self.tableView.reloadData()
【讨论】:
以上是关于在 Swift 中,如何在由结构对象数组组成的字典中进行搜索?的主要内容,如果未能解决你的问题,请参考以下文章
在由具有不同列名的 DataFrame 组成的字典中应用函数
C#WPF如何在由数据模板中的对象列表组成的列表框中设置项目[重复]