在Swift 5中过滤结构的嵌套数组

时间:2019-06-24 21:59:14

标签: arrays swift struct closures

struct Objects {
        var sectionName : String!
        var sectionObjects : [CountryList]!
    }

var objectArray = [Objects]()

这里objectArray是我的tableView数据源,其中sectionObjectsCountryList struct的数组。

struct CountryList: Codable {
    let country_id: String?
    let country_name: String?
    let country_code:  String?
    let country_flag_url: String?

    init(countryID: String, countryName: String, countryCode:  String, countryFlagURL: String) {
        self.country_id = countryID
        self.country_name = countryName
        self.country_code = countryCode
        self.country_flag_url = countryFlagURL
    }
}

我想根据objectArray过滤我的country_name

这是我在UISearchResultsUpdating中所做的。

extension CountryListViewController: UISearchResultsUpdating {
    public func updateSearchResults(for searchController: UISearchController) {
        guard let searchText = searchController.searchBar.text else {return}
        if searchText == "" {
            objectArray += objectArray
        } else {
            objectArray += objectArray

            objectArray = objectArray.filter {
                let countryListArray = $0.sectionObjects!
                for countryList in countryListArray {
                    print("cName \(String(describing: countryList.country_name))")
                    countryList.country_name!.contains(searchText)
                }
            }
        }
        self.countryListTableView.reloadData()
    }
}

并出现两个错误:

  

“包含”调用的结果未使用

     

闭包中缺少返回值,预计会返回“ Bool”

我在这里想念什么?任何建议将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:2)

filter期望里面有布尔值,所以您需要

var objectArray = [Objects]()
var filtered = [Objects]()

filtered = objectArray.filter {
  let countryListArray = $0.sectionObjects
  for countryList in countryListArray {
    print("cName \(String(describing: countryList.country_name))")
       if countryList.country_name!.contains(searchText) {
             return true 
        } 
   }
   return false
}

或者更好

filtered = objectArray.filter { $0.sectionObjects.filter { $0.country_name!.contains(searchText) }.count != 0 }

提示::使用另一个数组filtered来保存过滤后的数据,以免覆盖objectArray

中的主要内容