Как загрузить ответ JSON с кодируемой структурой в табличное представление, используя Swift 4.2? - PullRequest
0 голосов
/ 19 февраля 2019

Мой сценарий, я пытаюсь создать Codable для моего JSON ответа.Я создал codable структуру, но я не знаю, как load превратить ее в tableview.Здесь, когда я выбираю несколько ячеек tableview, мне нужно получить все выбранные данные ячейки username и идентификатор пользователя.Я не знаю, как начать, пожалуйста, дайте мне несколько советов.

Мой ответ

{
    "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
}

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Ваш вызов API должен вернуть объект Data.Для его анализа вы можете использовать:

 func parseWelcome(dataFromServer:Data,handlerDone: @escaping (_ welcome:Welcome) ->Void) ->Void {
    do {
        let welcome = try JSONDecoder().decode(Welcome.self, from:jsonData!)
        handlerDone(welcome)
    } catch {

        // A handler could be defined here for handeling bad response from server
        print("API:An error occurred while parsing server response Welcome")
    }
}

Вызовите функцию и передайте свои rawData с сервера.Я пришел к выводу, что у вас где-то есть массив User, поэтому давайте заполним его

parseWelcome(dataFromServer: rawData!) { parsedData in

   // Users should be an Array of Users defined by you somewhere
   users = parsedData.userList
}

Вызовем tableView и загрузим данные из массива ваших пользователей

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // create a new cell if needed or reuse an old one
        let cell = tableView.dequeueReusableCell(withIdentifier: "notes", for: indexPath)

        // Construct your cell on your needs use users[indexPath.row]
        ...
}

Но я согласен с @Robert Dresler, чтоУ вас плохой модельный дизайн.Рекомендуется немного изменить дизайн.

0 голосов
/ 19 февраля 2019

Во-первых, я бы переименовал вашу 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
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...