#ios #swift #tableview #hierarchy #hierarchical-data
#iOS #swift #просмотр таблицы #иерархия #иерархический-данные
Вопрос:
Как проанализировать уровень иерархий в формате дерева в
responseData из вызова API в настоящее время содержит двухуровневые иерархии
{
"result" : [
{
"name": "HIERARCHIES LEVELS",
"hierarchies" : [
{
"hierarchy_order" : 1,
"hierarchy_level" : 1,
"name": "LEVEL ONE",
"hierarchies" : [
{
"hierarchy_order" : 1,
"hierarchy_level" : 2,
"name": "LEVEL TWO",
"hierarchies" : [
],
"is_enabled" : true
}
],
"is_enabled" : true
},
{
"hierarchy_order" : 1,
"hierarchy_level" : 1,
"name": "LEVEL ONE",
"hierarchies" : [
{
"hierarchy_order" : 1,
"name" : "LEVEL TWO",
"hierarchy_level" : 2,
"hierarchies" : [
],
"is_enabled" : true
},
{
"hierarchy_order" : 1,
"name" : "LEVEL TWO",
"hierarchy_level" : 2,
"hierarchies" : [
],
"is_enabled" : true
}
],
"is_enabled" : true
}
]
}
]
}
ModelClass
struct AssignedHierarchyLevelModel {
let result: [Result]?
init(_ json: JSON) {
result = json["result"].arrayValue.map { Result($0) }
}
struct Result {
let name: String?
let hierarchies: [Hierarchies]?
init(_ json: JSON) {
name = json["name"].stringValue
hierarchies = json["hierarchies"].arrayValue.map { Hierarchies($0) }
}
}
struct Hierarchies {
let hierarchyOrder: Int?
let hierarchyLevel: Int?
let name: String?
let hierarchies: [Hierarchies]?
let isEnabled: Bool?
init(_ json: JSON) {
hierarchyOrder = json["hierarchy_order"].intValue
hierarchyLevel = json["hierarchy_level"].intValue
name = json["name"].stringValue
hierarchies = json["hierarchies"].arrayValue.map { Hierarchies($0) }
isEnabled = json["is_enabled"].boolValue
}
}
struct Hierarchies {
let hierarchyOrder: Int?
let hierarchyLevel: Int?
let name: String?
let hierarchies: [Hierarchies]?
let isEnabled: Bool?
init(_ json: JSON) {
hierarchyOrder = json["hierarchy_order"].intValue
hierarchyLevel = json["hierarchy_level"].intValue
name = json["name"].stringValue
hierarchies = json["hierarchies"].arrayValue.map { Hierarchies($0) }
isEnabled = json["is_enabled"].boolValue
}
}
}
После ответа
var assignedhierarchyResult = [AssignedHierarchyLevelModel.Result]()
func dataBindAccountSettingHierarchyLevel(){
hierarchyParentList.removeAll()
self.assignedhierarchyResult = self.assignedHierarchyLevelModel?.result ?? []
}
// Методы делегирования источника данных TableView
func numberOfChild(assignedhierarchyChilds: [AssignedHierarchyLevelModel.Result]) -> Int {
var arrayCount = [AssignedHierarchyLevelModel.Result.Hierarchies]()
assignedhierarchyChilds.enumerated().forEach { (indexValue,element) in
arrayCount.append(contentsOf: assignedhierarchyChilds[indexValue].hierarchies ?? [])
if arrayCount[indexValue].hierarchies?.count ?? 0 > 0 {
arrayCount[indexValue].hierarchies?.enumerated().forEach({ (subIndex, subElement) in
arrayCount.append(contentsOf: arrayCount[indexValue].hierarchies?[subIndex].hierarchies ?? [])
})
}
}
return arrayCount.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.numberOfChild(assignedhierarchyChilds: assignedhierarchyResult)
}
func numberOfSections(in tableView: UITableView) -> Int {
return assignedhierarchyResult.count
}
Попытка установить уровень иерархии для tableview, например AccordionLevels, не может обернуть мой набор данных с даты ответа. В обычном tableview я отображаю его отображаемые корневые родительские и дочерние элементы в списке tableview. Невозможно получить дочерний список.
Как получить данные извлечения из дочернего элемента [Иерархий] до конца подэлемента [Иерархий]?
Комментарии:
1. Я не понимаю, чего именно вы хотите. Раздел — это иерархия верхнего уровня, отлично. Раздел — это что? Его дочерние иерархии и дочерние дочерние структуры?
2. @Larme Повторяет родительские -> дочерние -> дочерние -> grand grand childer -> до завершения уровня family, что я хочу сделать здесь.
3. Но вы хотите отображать их как один и тот же уровень «дочернего»?
4. на дисплее @Larme будут отображаться уровни аккордеона
5. По крайней мере, мне нужно получить набор данных в консоли для печати, чтобы затем я привязал дату к таблице accordion tableview.
Ответ №1:
чтобы легко создавать модели (классы / структуры) для вашего json, используйте ссылку:- https://app.quicktype.io /
И используйте декодер json для декодирования
let decoder = JSONDecoder()
let loadedData = try? decoder.decode(struc.self, from: jsonData)
-> Ваша модель
struct Welcome: Codable {
var result: [Result]?
}
// MARK: - Result
struct Result: Codable {
var name: String?
var hierarchies: [Hierarchy]?
}
// MARK: - Hierarchy
struct Hierarchy: Codable {
var hierarchyOrder, hierarchyLevel: Int?
var name: String?
var hierarchies: [Hierarchy]?
var isEnabled: Bool?
enum CodingKeys: String, CodingKey {
case hierarchyOrder = "hierarchy_order"
case hierarchyLevel = "hierarchy_level"
case name, hierarchies
case isEnabled = "is_enabled"
}
}
-> теперь вы можете легко использовать его как
let myStrut = Welcome()
myStruct.result[Index].hierarchies[Index].name
Комментарии:
1. Проблема заключается в повторении до конца массива [иерархий] в перечислении, я могу отображать имена элементов, но не могу достичь конца цикла
2. Примечание сбоку:
CodingKeys
может быть отключено с помощью настройки вdecoder
snakeCase на camel.3. можете ли вы поделиться своими данными .. я могу настроить их для вас в виде таблицы
4. @Larme тогда у вас должен быть каждый ключ в случае змеи