Метод 1: Укажите свойства для поиска, используя [KeyPath]
:
Если вы просто хотите гибко указать, какие поля искать в структуре ToBeSearched
, вы можете передать массив [KeyPath]
свойств для поиска и использовать contains
с закрытием внутри filter
для проверьте, содержит ли какое-либо из свойств, указанных в keyPaths, текст, который вы ищете:
public func updateSearchResults(for searchController: UISearchController, using keyPaths: [KeyPath<ToBeSearched, String>]) {
if let text = searchController.searchBar.text,
!text.isEmpty {
data = completeData.filter { element in
keyPaths.contains { keyPath in element[keyPath: keyPath].lowercased().contains(text.lowercased()) }
}
} else {
data = completeData
}
reloadResults()
}
Пример:
Для поиска value1
и value2
:
updateSearchResults(for: searchController, using: [\.value1, \.value2])
Метод 2: Передать закрытие для метода filter
:
public func updateSearchResults(for searchController: UISearchController, using filterProc: (ToBeSearched) -> Bool) {
if let text = searchController.searchBar.text,
!text.isEmpty {
data = completeData.filter(filterProc)
}
} else {
data = completeData
}
reloadResults()
}
Пример:
let filterProc: (ToBeSearched) -> Bool = {
$0.value1.lowercased().contains(searchText) ||
$0.value2.lowercased().contains(searchText)
}
updateSearchResults(for: searchController, using: filterProc)