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 }) 
Другие вопросы по тегам