我在tableviewCell中添加了一个搜索栏,其中包含JSON数据我添加了一个函数,当searchBar中的文本发生更改时会触发该函数但是我收到错误。
这是我的Item类: -
struct Item : Codable {
var name = String()
var symbol = String()
var checked : Bool = false
init(bitJSON: JSON) {
self.name = bitJSON["name"].stringValue
self.symbol = bitJSON["symbol"].stringValue
}
}
这是我的tableview类: -
var items = [Item]()
let searchBar = UISearchBar()
var filteredArray = [String]()
var shouldShowSearchResults = false
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredArray = items.filter({ (names) -> Bool in // ERROR
return names.name.lowercased().range(of: searchText.lowercased()) != nil
})
if searchText != "" {
shouldShowSearchResults = true
self.tableView.reloadData()
}else {
shouldShowSearchResults = false
self.tableView.reloadData()
}
}
答案 0 :(得分:0)
filter
实际上并没有改变数组的类型。过滤后的[Item]
仍为[Item]
。因此,您无法将其分配给[String]
类型的属性。
要将数组的每个元素转换为其他元素(在本例中为String
),您应该调用map
:
filteredArray = items.filter({ (names) -> Bool in
return names.name.lowercased().range(of: searchText.lowercased()) != nil
})
.map { $0.name } // this line!
答案 1 :(得分:0)
Filter只是生成一个新数组,其中删除了oroginal数组中的某些元素。如果您想从生成一个新的数组过滤后的数组,那么您就可以执行一个地图了。或者,如果您想一步完成所有操作,您可以执行flatMap:
filteredArray = items.flatMap { (names) -> String? in
if names.name.lowercased().range(of:searchText.lowercased()) != nil {
return names.name
}
else {
return nil
}
}
这将为您提供符合您要求的所有字符串数组。
注意:在Swift 4.1中,flatMap
已重命名为compactMap
。