Извлечение данных из словаря в swift 4 - PullRequest
0 голосов
/ 13 июня 2018

Я использую этот 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 ключе.Как я могу сохранить все эти значения и распечатать его в виде таблицы.Это весь мой код, который я делаю. Я использую контроллер сегмента для изменения данных в соответствии с датой месяцев enter image description here

Ответы [ 4 ]

0 голосов
/ 13 июня 2018

Сначала создайте класс для моделирования ответа:

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

        }
    }
}

Тогда единственное, что вам нужно сделать, это заполнить tableView объектами в массиве 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
}

Конечно, требуется адаптация в соответствии сдля ваших нужд.

0 голосов
/ 13 июня 2018

Объявление массива строк

var arrjsondata = [String:Any]()

назначение данных в

arrjsondata = data

после перезагрузки таблицы

0 голосов
/ 13 июня 2018

Попробуйте это:

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

    print(innerDict["day"])

}

Для хранения данных вы можете создать простой класс с необходимыми полями и проанализировать ответ в этом классе, затем поместить весь объект в массив, затем в табличное представление.

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()
}
0 голосов
/ 13 июня 2018

Значение само по себе является словарем, поэтому вы можете получить доступ к отдельным полям, например, так:

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