我对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变量。
答案 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
}