代码之家  ›  专栏  ›  技术社区  ›  viper

swift 4中从字典中提取数据

  •  0
  • viper  · 技术社区  · 7 年前

    我在用这个 api 并希望在表视图上打印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!
    
       }
    

    使用此代码后,我得到了键和值我的问题是我得到了6值在1键。如何存储所有这些值并将其打印到TableView上。这是我正在做的全部代码我正在使用段控制器根据日期月份更改数据 enter image description here

    4 回复  |  直到 7 年前
        1
  •  1
  •   thxou    7 年前

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

    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 数组:

    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
    }
    

    当然,它需要根据你的需要进行调整。

        2
  •  1
  •   Eridana    7 年前

    试试这个:

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

    若要存储数据,可以创建包含必需字段的简单类,并分析该类中的响应,然后将所有对象放入数组,然后转到TableView。

    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()
    }
    
        3
  •  0
  •   Dalton Sweeney    7 年前

    该值本身就是一个字典,因此您可以访问如下所示的各个字段

    if let innerDict = value as? [String: Any] {
        print(\(innerDict["day"]))
        print(\(innerDict["db"]))
        ...
    }
    
        4
  •  0
  •   Jigar    7 年前

    声明字符串数组

    var arrjsondata = [String:Any]()
    

    在中分配数据

    arrjsondata = data
    

    重新加载TableView之后