Swift:将arrayObject显示到tableView

时间:2018-11-21 01:50:26

标签: ios swift uitableview

im试图分散来自api响应的数组对象,在表视图中显示为[[String:Any]] 那就是我的结构

class CategoriesDep: NSObject {

    var depName: String
    var depImage: String
    var subName = [subData]()

    init?(dict: [String: JSON]) {

        guard let image = dict["main_department_image"]?.imagePath, !image.isEmpty else { return nil }

        self.depImage = image
        self.depName = (dict["main_department_name"]?.string)!




    }

    struct subData {
        var dep: String
        init(dic: [String: Any]) {
            self.dep = dic["sub_department_name"] as! String

        }
    }
}

2 个答案:

答案 0 :(得分:0)

请检查以下代码以解析您的json

class CategoriesDep: NSObject {
    var depName: String
    var depImage: String
    var subName = [subData]()

    init?(dict: [String: Any]) {

        guard let image = dict["main_department_image"] as? String, !image.isEmpty else { return nil }

        self.depImage = image
        self.depName = (dict["main_department_name"] as? String)!
        subName = []
        for subDict in (dict["sub_depart"] as? [[String:Any]] ?? []){
            subName.append(subData(dic: subDict))
        }

    }

}
struct subData {
     var dep: String
     var image :String
     var id : String
     init(dic: [String: Any]) {
          self.dep = dic["sub_department_name"] as! String
          self.image = dic["sub_department_image"] as! String
          self.id = dic["sub_department_id"] as! String
     }
}

,如果要访问CategoriesDep类之外的子数据结构,请在CategoriesDep类之外声明结构

像这样解析给定的JSON Respoise

       let json =  [
            [ "sub_depart" : [
                [ "sub_department_name" : "hos", "sub_department_id" : "6", "sub_department_image" : "23.jpg"
                ]
                ],
              "main_department_id" : "2",
              "main_department_name" : "main ",
              "main_department_image" : "14.jpg"
            ],
            ]
        var catDepart : [CategoriesDep] = []
        for dict in json {
            catDepart.append(CategoriesDep(dict: dict)!)
        }
        print(catDepart[0].subName[0].dep)

答案 1 :(得分:0)

您可以使用Codabel协议以更加迅速;)并清理代码。

let jsonString = "[{\"sub_depart\" : [ {\"sub_department_name\" : \"hos\", \"sub_department_id\" : \"6\", \"sub_department_image\" : \"23.jpg\" } ], \"main_department_id\" : \"2\", \"main_department_name\" : \"main \", \"main_department_image\" : \"14.jpg\"}]"

struct CategoriesDep: Codable {

    let mainDepartmentName: String
    let mainDepartmentImage: String
    let mainDepartmentId: String
    var subDepart: [SubData] = []
}

struct SubData: Codable {

    let subDepartmentName: String
    let subDepartmentImage: String
    let subDepartmentId: String
}



if let jsonData = jsonString.data(using: .utf8) {

    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    var departments: [CategoriesDep]? = try? decoder.decode([CategoriesDep].self, from: jsonData)

    ...

}

请注意此处的decoder.keyDecodingStrategy = .convertFromSnakeCase会将下划线(snake_case)API属性名称映射到您的camelCase名称。

如果需要其他属性名称,则必须实现CodingKeys枚举来映射它们。

有关更多详细信息,请检查此link