我有一个结构体数据模型,还有一个包含 JSON 字典的 API。我需要用字典中的值填充表视图单元格。我已经创建了一个包含键值的数组,以将其传递给视图控制器中的标签之一。我有一个文本字段和一个标签,我希望 API 中的数据与包含键的数组中的数组元素相对应地显示。
这是我的视图控制器[已编辑];
import UIKit
class FirstViewController: UIViewController {
@IBOutlet weak var DataTable: UITableView!
var UserArr = ["ID", "UID", "Password", "First Name", "Last Name", "Username", "Email", "Avatar", "Gender", "Phone Number", "Social Insurance Number", "Date Of Birth", "Employment", "Address", "Zip Code", "State", "Country", "Coordinates", "CC Number", "Subscription"]
var userDataFromApi = [UserData]()
override func viewDidLoad() {
super.viewDidLoad()
NetworkManager.sharedInstance.fetchData{
apiData in
self.userDataFromApi = apiData
DispatchQueue.main.async { [self] in
DataTable.reloadData()
}
}
DataTable.dataSource = self
DataTable.delegate = self
}
}
extension FirstViewController : UITableViewDelegate,UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return userDataFromApi.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = DataTable.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! DataTableViewCell
let rowdata = userDataFromApi[indexPath.row]
cell.txtLabel.text = UserArr[indexPath.row]
cell.txtField.text = rowdata.first_name
return cell
}
}
我的数据模型
import Foundation
struct UserData : Codable {
let id : Int
let uid : String
let password : String
let first_name : String
let last_name : String
let username : String
let email : String
let avatar : String
let gender : String
let phone_number : String
let social_insurance_number : String
let date_of_birth : String
let employment : Employment
struct Employment : Codable {
let title : String
let key_skill: String
}
let address : Address
struct Address : Codable {
let city : String
let street_name : String
let street_address : String
let zip_code : String
let state : String
let country : String
let coordinates : Coordinates
struct Coordinates : Codable {
let lat : Double
let lng : Double
}
}
let credit_card : Credit_card
struct Credit_card : Codable {
let cc_number : String
}
let subscription : Subscription?
struct Subscription : Codable {
let plan : String
let status : String
let payment_method : String
let term : String
}
}
我在哪里发出 API 请求
import Foundation
import Alamofire
class NetworkManager {
static let sharedInstance = NetworkManager()
private init() {
}
func fetchData(handler: @escaping (_ apiData :[UserData]) -> (Void)){
guard let url = URL(string: "https://random-data-api.com/api/v2/users")
else {
return
}
AF.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil, interceptor: nil) .response { resp in
switch resp.result {
case .success(let data) :
do {
let json = try JSONDecoder().decode([UserData].self, from: data!)
print("Data is : \(json)")
print(type(of: json))
handler(json)
}
catch{
print(error)
}
case .failure(let error) :
print(error.localizedDescription)
}
}
}
}
起初我尝试将其解析为数组,但它没有加载任何内容。请随时提出改进建议,因为我是学习 Swift 的初学者。
起初我尝试将其解析为数组,但它没有加载任何内容。请随时提出改进建议,因为我是学习 Swift 的初学者。
这是因为你从你的API中获取了字典并且你试图将它存储在数组中。
你需要稍微改变一下你的api调用函数。
func fetchData(handler: @escaping (_ apiData :UserData) -> (Void)){
guard let url = URL(string: "https://random-data-api.com/api/v2/users")
else {
return
}
AF.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil, interceptor: nil) .response { resp in
switch resp.result {
case .success(let data) :
do {
let json = try JSONDecoder().decode(UserData.self, from: data!)
print("Data is : \(json)")
print(type(of: json))
handler(json)
}
catch{
print(error)
}
case .failure(let error) :
print(error.localizedDescription)
}
}
}
NetworkManager.sharedInstance.fetchData{
apiData in
print("api data - ",apiData)
// you can save your data in array accordingly
}