Я использовал это ниже json для пустышки
[
{
"title": "Languages",
"name_list": [
{
"title": "Sub 1",
"locked": true
},
{
"title": "Sub 2",
"locked": true
},
{
"title": "Sub 3",
"locked": false
},
{
"title": "Sub 4",
"locked": true
},
{
"title": "Sub 5",
"locked": false
}
]
},
{
"title": "Subject",
"name_list": [
{
"title": "Sub 6",
"locked": false
},
{
"title": "Sub 7",
"locked": false
},
{
"title": "Sub 8",
"locked": false
}
]
}
]
Модель Структуры для этого json:
public struct TestModel {
public var nameList : [NameList]
public var title : String
}
public struct NameList {
public var locked : Bool
public var title : String
}
Мой json находится в локальном проекте, поэтому я использую это ниже func to
func getLocalData(){
let url = Bundle.main.url(forResource: "testjson", withExtension: "json")!
do {
let jsonData = try Data(contentsOf: url)
let json = try JSONSerialization.jsonObject(with: jsonData) as! [Any]
self.arrData = self.createDataModel(json)
}
catch {
print(error)
}
}
Функция для привязки json к структуре модели
func createDataModel (_ json : [Any]) -> [TestModel] {
var arr = [TestModel]()
for adata in json {
let aDictItems = adata as! [String : Any]
let aNameListData = aDictItems["name_list"] as! [Any]
var arrNameList = [NameList]()
for aName in aNameListData {
let adictname = aName as! [String : Any]
arrNameList.append(NameList.init(locked: adictname["locked"] as! Bool, title: adictname["title"] as! String ))
}
arr.append(TestModel.init(nameList: arrNameList, title: aDictItems["title"] as! String))
}
return arr
}
И, наконец, функция, которая сортирует ваш список по количеству заблокированных счетчиков (false
) и возвращает обратно отфильтрованные данные.
func filterData (_ searchText : String) -> [TestModel] {
if searchText == "" { return arrData }
let s = arrData.sorted { (res1, res2) -> Bool in
var count1 = 0, count2 = 0
for r in res1.nameList {
if !r.locked {
count1 += 1
}
}
for r in res2.nameList {
if !r.locked {
count2 += 1
}
}
return count1 > count2
}
let f = s.filter {
$0.nameList.contains(where: { (aNameRes) -> Bool in
aNameRes.title.contains(searchText)
})
}
return f
}
Редактировать: Показать данные в ячейке
tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return filtered.Count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
:
// filtered[indexPath.row].title // your tableview cell title
// filtered[indexPath.item].nameList // your collectView Data, Use this array to show data in collectionview
}
Примечание: Ваш API json Данные и отфильтрованные данныевсегда быть таким же.Если в строке поиска нет строки, вам нужно переключить отфильтрованные данные с исходными данными API.
Если что-то изменится в вашем требовании, дайте мне знать.