我的情况是,我正在尝试为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
}
答案 0 :(得分:3)
首先,我将您的UserList
模型重命名为User
和User
仅重命名为Name
(然后将该属性重命名为name ...然后可以重命名{ {1}}的属性)
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
答案 1 :(得分:0)
您的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的观点,您的模型设计不正确。建议重新设计一下。