Уровень иерархии извлекает данные до конца уровней

#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 тогда у вас должен быть каждый ключ в случае змеи