从 swift 中的字典中提取数据 4

Extracting data from dictionary in swift 4

我正在使用这个 api 并想在 table 视图

上打印 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 上。这是我正在做的整个代码我正在使用段控制器根据日期月份更改数据

该值本身就是一个字典,因此您可以像这样访问各个字段

if let innerDict = value as? [String: Any] {
    print(\(innerDict["day"]))
    print(\(innerDict["db"]))
    ...
}

声明字符串数组

var arrjsondata = [String:Any]()

中分配数据
arrjsondata = data

重新加载您的表格视图后

试试这个:

for (key, value) in data {
    guard let innerDict = value as? [String: Any] else {
        continue
    }

    print(innerDict["day"])

}

要存储数据,您可以创建带有必要字段的简单 class 并在此 class 中解析响应,然后将所有对象放入数组,然后放入表视图。

class MyData : NSObject {
    var dateTitle: String?
    var day: Int?
    var date: Date?
    var month: Int?
    var quarter: Int?

    override init() {
        super.init()
    }
}

// ....

// in parsing function
var result = [MyData]()
    for (key, value) in data {
        guard let innerDict = value as? [String: Any] else {
            continue
        }
        let obj = MyData()
        obj.day = innerDict["day"] as? Int
        // etc...
        result.append(obj)

}

DispatchQueue.main.async {
    self.tableView.reloadData()
}

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

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
}

当然需要根据自己的需要进行适配。