Swift SearchBar не может фильтровать данные - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть настройки UISearchBar.но я получаю сообщение об ошибке.

Невозможно присвоить значение типа '[cellData]' для типа '[String]'

вот код

struct cellData {
let jobTitle : AnyObject?
let companyName : String?
let jobLocation : String?
let jobDescription : String?
let jobReq : String?
let firstPosterImage : AnyObject?
let secondPosterImage : AnyObject?
let createdAt : Date

init(jobTitle: AnyObject?, companyName: String? = nil, jobLocation: String? = nil ,jobDescription: String? = nil, jobReq:String? = nil, firstPosterImage: AnyObject? = nil, secondPosterImage: AnyObject? = nil, timeStamp:Double) {

    self.jobTitle = jobTitle
    self.companyName = companyName
    self.jobLocation = jobLocation
    self.jobDescription = jobDescription
    self.jobReq = jobReq
    self.firstPosterImage = firstPosterImage
    self.secondPosterImage = secondPosterImage
    self.createdAt = Date(timeIntervalSince1970: timeStamp/1000) 

}

}

var cellDataArray = [cellData]()
var filtered = [String]()


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


    if searchText.isEmpty {
        isSearching = false
        tableView.reloadData()

    } else {
        isSearching = true
        filtered  = cellDataArray.filter({($0.jobTitle?.lowercased?.contains(searchText.lowercased()))!})
        tableView.reloadData()
    }


}

В этой строке я получаю сообщение об ошибке

filtered  = cellDataArray.filter({($0.jobTitle?.lowercased?.contains(searchText.lowercased()))!})

.обратите внимание, что CellDataArray имеет структуру cellData.и я использую searchBar в tableView.

Спасибо.

1 Ответ

0 голосов
/ 08 февраля 2019

Ваша проблема в том, что cellDataArray и filtered имеют два разных типа данных (String и struct CellData), поэтому вы не можете просто назначить один другому без преобразования, подобного

let res  = cellDataArray.filter({($0.jobTitle?.lowercased?.contains(searchText.lowercased()))!})
filtered  = res.map { $0.anyProprtyInside } // property should be a String

Что вы можете иметь в виду, это объявить фильтр как

var filtered = [CellData]() // start structs / classes / protocols with uppercase letter
...