ios - 在swift 4中从字典中提取数据

标签 ios json swift dictionary swift4.1

我正在使用这个 api并想在 TableView 上打印 api 数据

     import UIKit
     import Alamofire

     class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

      @IBOutlet weak var tableView: UITableView!
     @IBOutlet weak var mySegmentedControl: UISegmentedControl!





override func viewDidLoad() {
    super.viewDidLoad()

    apiData()
}

@IBAction func mySegmentControlTapped(_ sender: Any) {
    tableView.reloadData()
}


func apiData() {
    Alamofire.request("https://api.lrs.org/random-date-generator?lim_quarters=40&source=api-docs", method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            guard let json = response.result.value as? [String:Any] else{ return}
            print("Response \(json)")
            guard let data = json["data"] as? [String:Any] else { return}
            print("data is \(data)")

            for (key, value) in data {
                print("\(key) -> \(value)")


            }

            break

        case .failure(_):
            print(response.result.error as Any)
            break

        }
    }

}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    var returnValue = 0

    switch(mySegmentedControl.selectedSegmentIndex)
    {
    case 0:
        returnValue = day.count
        break
    case 1:
        returnValue = month.count
        break

    case 2:
        returnValue = db.count
        break

    case 3:
        returnValue = day.count
        break

    default:
        break

    }

    return returnValue
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let myCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! tableCell

    switch(mySegmentedControl.selectedSegmentIndex)
    {
    case 0:
        myCell.labelOne!.text = " "
        myCell.labelTwo!.text = ""
        myCell.labelThree!.text = ""
        myCell.labelFour!.text = ""
        break
    case 1:

        break

    case 2:

        break

    case 3:

        break

    default:
        break

    }
    return myCell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 90
}


}

class tableCell: UITableViewCell {

@IBOutlet weak var labelOne: UILabel!
@IBOutlet weak var labelTwo: UILabel!
@IBOutlet weak var labelThree: UILabel!
@IBOutlet weak var labelFour: UILabel!

   }

使用此代码后,我获得了键和值,我的问题是我在 1 个键中获得了 6 个值。我如何存储所有这些值并将其打印在 tableview 上。这是我正在做的整个代码我正在使用段 Controller 根据日期月份更改数据 enter image description here

最佳答案

首先创建一个类来模拟响应:

class CustomDate: NSObject {
    var quarter: Int!
    var day: String!
    var month: String!
    var db: String!
    var long: String!
    var unix: Int!

    init(quarter: Int, day: String, month: String, db: String, long: String, unix: Int) {
        super.init()

        self.quarter = quarter
        self.day = day
        self.month = month
        self.db = db
        self.long = long
        self.unix = unix
    }
}

然后创建一个数组来存储所有收到的日期:

var dates = [CustomDate]()

apiData 的实现更改为:

func apiData() {
    Alamofire.request("https://api.lrs.org/random-date-generator?lim_quarters=40&source=api-docs", method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            guard let json = response.result.value as? [String: Any] else { return }
            guard let data = json["data"] as? [String: Any] else { return }

            for (_, value) in data {
                let dateValue = value as! [String: Any]
                let date = CustomDate(quarter: dateValue["quarter"] as! Int,
                                      day: dateValue["day"] as! String,
                                      month: dateValue["month"] as! String,
                                      db: dateValue["db"] as! String,
                                      long: dateValue["long"] as! String,
                                      unix: dateValue["unix"] as! Int)

                self.dates.append(date)
            }
            print(self.dates)
            self.tableView.reloadData()
            break
        case .failure(_):
            print(response.result.error as Any)
            break

        }
    }
}

然后您唯一需要做的就是用 dates 数组中的对象填充您的 tableView:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return dates.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let date = dates[indexPath.row]

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.textLabel.text = date.long
    return cell
}

当然,它需要根据您的需要进行适配。

关于ios - 在swift 4中从字典中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50838724/

相关文章:

ios - 如何在 Swift 中取消正在进行的 HTTP 请求?

ios - 在 iOS 中未显示隐私警报的本地化文本

ios - 如何使用 JSQMessagesViewController 发送图片?

ios - 在 uitableview 单元格中执行操作按钮以执行删除功能

ios - 在应用程序委托(delegate)中导入 AWSCore header - Swift

JSON Unmarshal 不规则的 JSON 字段

javascript - Angular4 http 获取解析错误

ios - 从 Unity 桥接到 Swift 时通知中心不调用

ios - UITextView隐藏键盘

javascript - JSON CSRF/盗窃攻击是否仍然可能?