UItableview中的JSON数据中的排序和部分

时间:2019-05-01 11:15:26

标签: ios json swift uitableview

我已经为包裹数据定义了数据模型,但是需要基于

定义UITableview
  

subscriptiontype =“每年”,“每月”,“每周”

得到错误-无法将类型“ [Package]”的值分配给类型“ [[String : String]]?”。如何将其分配给tableview部分。

代码:

var packag = [Package]()
enum TableSection: Int {
    case subscriptionType = 0, yearly, monthly, weekly, total
}
var data = [TableSection: [[String: String]]]()

func sortData() {
    data[.yearly] = packag.filter({ $0.subscriptionType == "yearly" })
    data[.monthly] = packag.filter({ $0.subscriptionType == "monthly" })
    data[.weekly] = packag.filter({ $0.subscriptionType == "weekly" })

}

更新的代码-viewdidload():

override func viewDidLoad() {
    super.viewDidLoad()
    tableview.dataSource = self
    tableview.delegate = self


    //fetchData()
    if let path = Bundle.main.path(forResource: "packageList", ofType: "json") {
        do {
            let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)

            let decoder = JSONDecoder()
            decoder.dateDecodingStrategy = .custom{ decoder -> Date in
                let container = try decoder.singleValueContainer()
                let dateStr = try container.decode(String.self)
                return Date(timeIntervalSince1970: TimeInterval(dateStr)!)
            }
            let jSON = try? decoder.decode(Root.self, from: data)

            if let packages = jSON?.packages {
                self.sortData(packages: packages)
                print(packages)

            }
        } catch {
            // handle error
            print(Error.self)
        }
    }

}

根模型:

struct Root : Codable {

    let packages : [Package]
}

包装型号:

struct Package : Codable {

    let availableUntil : Date
    let benefits : [String]?
    let desc : String
    let didUseBefore : Bool
    let name : String
    let price : Double
    let subscriptionType : String
    let tariff : Tariff
}

Traiff模型:

struct Tariff : Codable {

    let data : String
    let sms : String
    let talk : String
}

更新了PackageJson数据:

{ "packages": [
{
  "name": "Platinum Maksi 6 GB",
  "desc": "Zengin içerikli Platinum Maksi Paketi ile Turkcell Uygulamalarının keyfini sürün!",
  "subscriptionType": "monthly",
  "didUseBefore": true,
  "benefits": [
    "TV+",
    "Fizy",
    "BiP",
    "lifebox",
    "Platinum",
    "Dergilik"
  ],
  "price": 109.90,
  "tariff": {
    "data": "6144",
    "talk": "2000",
    "sms": "100"
  },
  "availableUntil": "1558131150"
},
{
  "name": "Platinum Maksi 8 GB",
  "desc": "Zengin içerikli Platinum Maksi Paketi ile Turkcell Uygulamalarının keyfini sürün!",
  "subscriptionType": "monthly",
  "didUseBefore": false,
  "benefits": [
    "TV+",
    "Fizy",
    "BiP",
    "lifebox",
    "Platinum",
    "Dergilik"
  ],
  "price": 129.90,
  "tariff": {
    "data": "8192",
    "talk": "2000",
    "sms": "100"
  },
  "availableUntil": "1555060350"
},
{
  "name": "Platinum Maksi 12 GB",
  "desc": "Zengin içerikli Platinum Maksi Paketi ile Turkcell Uygulamalarının keyfini sürün!",
  "subscriptionType": "yearly",
  "didUseBefore": false,
  "benefits": [
    "TV+",
    "Fizy",
    "BiP",
    "lifebox",
    "Platinum",
    "Dergilik"
  ],
  "price": 109.90,
  "tariff": {
    "data": "12288",
    "talk": "2000",
    "sms": "100"
  },
  "availableUntil": "1555060350"
},

2 个答案:

答案 0 :(得分:1)

型号

    import Foundation

    struct JSON: Codable {
        let packages: [Package]
    }

    struct Package: Codable {
        let name, desc, subscriptionType: String
        let didUseBefore: Bool
        let benefits: [String]
        let price: Double
        let tariff: Tariff
        let availableUntil: String
    }

    struct Tariff: Codable {
        let data, talk, sms: String
    }

枚举

enum TableSection: Int {
    case subscriptionType = 0, yearly, monthly, weekly, total
}

数据

var data = [TableSection: [Package]]()

解析

    if let path = Bundle.main.path(forResource: "document", ofType: "json") {
        do {
            let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)
            let jSON = try? JSONDecoder().decode(JSON.self, from: data)

            if let packages = jSON?.packages {
                self.sortData(packages: packages)
            }
        } catch {
            // handle error
        }
    }

排序

private func sortData(packages : [Package]) {
    data[.yearly] = packages.filter({ $0.subscriptionType == "yearly" })
    data[.monthly] = packages.filter({ $0.subscriptionType == "monthly" })
    data[.weekly] = packages.filter({ $0.subscriptionType == "weekly" })

    print("Data is \(data)")
}

我使用LOCAL JSON,可以使用服务器数据。

答案 1 :(得分:0)

问题是您试图将Package对象分配给期望字典数组的值。

您的data变量是一个字典,具有一个TableSection作为键,以及一个字典数组作为您通过编写[[String: String]]定义的值。然后,在您的sortData函数中,您尝试为各种数据键分配一个值,但是当您期望使用字典数组时,您就为其分配了一个Package项目。

将数据定义更改为

是可行的
var data = [TableSection: Package]()