Фильтрация вложенного массива struct в swift 5 - PullRequest
1 голос
/ 25 июня 2019
struct Objects {
        var sectionName : String!
        var sectionObjects : [CountryList]!
    }

var objectArray = [Objects]()

Здесь objectArray - мой tableView источник данных, где sectionObjects - массив CountryList 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 Ответ

2 голосов
/ 25 июня 2019

filter ожидает возврата bool, поэтому вам нужно

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

...