SearchBar Фильтр базы по имени объекта - Swift 4
У меня есть панель поиска с этим форматом данных в качестве объекта Realm.
Optional(Results<Place> <0x7fb0d9e0bb10> (
[0] Place {
name = Federal Street;
country = United States;
lat = 42.5447229;
lon = -71.2809886;
},
...
Я пытаюсь заставить фильтр работать
//MARK: - Search bar methods
extension PlacesVC : UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
print("searchText \(searchText)")
places = places.filter { ($0["name"] ?? "").range(of: searchBar.text ?? "", options: [ .caseInsensitive, .diacriticInsensitive ]) != nil }
if searchBar.text?.count == 0 {
load()
DispatchQueue.main.async {
searchBar.resignFirstResponder()
}
}
table.reloadData()
}
}
Я продолжал получать
Невозможно указать значение неверного или неоднозначного типа
Любые намеки на то, что я сделал не так?
3 ответа
Решение
Что также должно работать, если вы используете NSPredicate
let bPredicate: NSPredicate = NSPredicate(format: "SELF.name contains[cd] %@", searchText)
places.filter(using: bPredicate)
Это то что я сделал
extension PlacesVC : UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
places = places?.filter("name CONTAINS[c] %@", searchBar.text!).sorted(byKeyPath: "name", ascending: true)
if searchBar.text?.count == 0 {
load()
DispatchQueue.main.async {
searchBar.resignFirstResponder()
}
}
table.reloadData()
}
}
и работает отлично
Надеюсь, что это поможет кому-то, как я в будущем.
Фильтр может быть как:
places = places.filter({
$0
.name
.uppercased()
.components(separatedBy: .whitespaces)
.filter { $0.hasPrefix(searchText.uppercased())}
.count > 0
}).sorted(by: { $0.name > $1.name })