如何使用Swift将json数据添加到数组或类似数据

时间:2016-10-12 16:51:06

标签: arrays json swift xcode swift3

我对Swift相当新,我在理解如何做我想做的事情上遇到了一些问题。

我正在用json测试一些东西。 我想要做的是将我从json数据中获取的数据附加到数组中。当我的数组包含我希望将它呈现给我的UICollectionView的数据时。我假设我应该使用数组。

import UIKit
import Foundation

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func getData() {

        let path = "http://myurl/test.json"
        let url = URL(string: path)
        let session = URLSession.shared

        let task = session.dataTask(with: url!) { (data: Data?, response: URLResponse?, error: Error?) in

            let json = JSON(data: data!)

            for result in json["dokumentstatus"]["dokutskott"]["utskott"].array! {

                let punkter = result["punkt"].string!
                print("punkt: \(punkt)")

                let rubrik = result["rubrik"].string
                print("rubrik: \(rubrik)")

                let forslag = result["forslag"].string
                print("förslag: \(forslag)")
            }
        }

        task.resume()
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return //someArray.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCollectionViewCell

        cell.customLabel.text = //Put the data form rubrik variable
            cell.customTW.text = //Put the data from foreleg variable

        return cell

    }
}

函数getData()获取正确的json数据我只需要帮助了解如何将此数据放入数组。 (另外,我知道我可能不应该在ViewController中获取数据,但这只是一个测试。)

import Foundation

class Information: NSObject {
    var punkter: String?
    var rubrik: String?
    var forslag: String?
}

我想我可能应该使用看起来像这样的数组:var someArray = [Information]() 但我不知道如何使用我的getData() 或者也许我应该使用三个不同的数组,每个数组对应一个json变量。

1 个答案:

答案 0 :(得分:1)

由于你仍在使用自定义类(做得好!,三个不同的数组很可怕),所以声明像你建议的数据源数组是正确的

var someArray = [Information]()

很可能结构就足够了,我建议使用非可选字符串

struct Information {
    var punkter : String
    var rubrik : String
    var forslag : String
}

如果属性不会改变,你甚至可以使用let来使属性成为常量。

要填充数组,请使用nil coalescing运算符检查nil,使用memberwise初始化程序创建Information实例,并将实例附加到数据源数组。然后在主线程上重新加载集合视图。

...
for result in json["dokumentstatus"]["dokutskott"]["utskott"].array! {

  let punkter = result["punkt"].string ?? ""
  let rubrik = result["rubrik"].string ?? ""
  let forslag = result["forslag"].string ?? ""
  let information = Information(punkter:punkter, rubrik:rubrik, forslag:forslag)
  self.someArray.append(information)

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

修改

cellForItemAtIndexPath使用

中显示数据
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCollectionViewCell

    let information = someArray[indexPath.row]
    cell.customLabel.text = information.rubrik
    cell.customTW.text = information.foreleg
    return cell
}