0
votes

I am trying to implement a searchbar for a tableView and I am receiving the error "...Binary operator '==' cannot be applied to operands of type 'Place' and 'String'" in my textDidChange method. The tableView is populated from a Firebase database "placeList" array. Not sure where the error source is coming from. Thanks in advance for any help!

lazy var searchBar:UISearchBar = UISearchBar()

var placeList = [Place]()
var placesDictionary = [String: Place]()

var isSearching = false
var filteredData = [Place]()

override func viewDidLoad() {
    super.viewDidLoad()

    searchBar.searchBarStyle = UISearchBarStyle.prominent
    searchBar.placeholder = " Search Places..."
    searchBar.sizeToFit()
    searchBar.isTranslucent = false
    searchBar.backgroundImage = UIImage()
    searchBar.delegate = self
    searchBar.returnKeyType = UIReturnKeyType.done
    navigationItem.titleView = searchBar

    tableView.allowsMultipleSelectionDuringEditing = true

}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellId)

    if isSearching {
        cell.textLabel?.text = filteredData[indexPath.row].place
    } else {

    cell.textLabel?.text = placeList[indexPath.row].place

    }
    return cell
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    if searchBar.text == nil || searchBar.text == "" {
        isSearching = false
        view.endEditing(true)
        tableView.reloadData()
    } else {
        isSearching = true
        // error in below line of code...
        filteredData = placeList.filter({$0.place == searchBar.text})
        tableView.reloadData()
    }

}
1

1 Answers

1
votes

Your property placeList is an array of Place objects. When you call the filter function on your array (placeList.filter({$0 == searchBar.text!})), what you are saying is "filter placeList where a Place object is equal to searchBar.text". A place object is not a String, you cannot compare two different types. I'm not familiar with your data model, or your Place class, but maybe you have some type of String property in your Place class which you could use to compare? For instance, say Place had a property called id of type String, you could then filter through comparison like so: filteredData = placeList.filter({$0.id == searchBar.text!}) - notice the added $0.id.

You can only compare a String to a String