错误:无法指定类型' [项目]'的值输入' [String]'

时间:2018-04-15 17:12:56

标签: ios swift

我在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()

        }
    }

2 个答案:

答案 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