首页 > 解决方案 > 如何使用 Swift 4.2 将具有可编码结构的 JSON 响应加载到 tableview 中?

问题描述

我的场景,我正在尝试Codable为我的JSON响应创建。我已经完成了codable结构,但我不知道如何将load它放入tableview. 在这里,每当我选择多个tableview单元格时,我都需要获取所有选定的单元格数据username和用户 ID。我不知道如何开始,请给我一些建议。

我的回复

{
    "status": 200,
    "user_list": [
        {
            "user_id": “1234”,
            "permission": 1,
            "active": 1,
            "user": {
                "firstname": “jack”,
                "lastname": “m”
            }
        },etc,...
        ]
}

我的可编码格式

struct Welcome: Codable {
    let status: Int
    let userList: [UserList]

    enum CodingKeys: String, CodingKey {
        case status
        case userList = "user_list"
    }
}

struct UserList: Codable {
    let userID: String
    let permission, active: Int
    let user: User

    enum CodingKeys: String, CodingKey {
        case userID = "user_id"
        case permission, active, user
    }
}

struct User: Codable {
    let firstname, lastname: String
}

标签: iosjsonswifttableview

解决方案


首先,我会将您的UserList模型重命名为User并且User只是为了Name(并将此属性重命名为命名......然后您可以重命名Name的属性)

struct Welcome: Codable { // you can avoid using `CodingKeys` here since you can
    let status: Int       // set `keyDecodingStrategy` of decoder which does work 
    let userList: [User]  // for you
}

struct User: Codable {
    let userId: String
    let permission, active: Int
    let name: Name

    enum CodingKeys: String, CodingKey {
        case name = "user"
        case permission, active, userId
    }
}

struct Name: Codable {
    let first, last: String
}

然后我认为在你的情况下你的数据源数组UITableView应该只包含用户,所以......你的User模型。

var users = [User]()

然后您可以将此数组分配为您的解码响应的userList属性

do {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let decoded = try decoder.decode(Welcome.self, from: someData)
    self.users = decoded.userList
} catch { print(error) }

现在,对于UITableView确定行数的数据源方法,使用用户数

func numberOfSections(in tableView: UITableView) -> Int {
    return users.count
}

并供cellForRowAt某些用户使用

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
    let user = users[indexPath.row]
    // e.g. let firstname = user.name.first
    ...
}

推荐阅读