Сортировка и раздел в UItableview из данных JSON - PullRequest
0 голосов
/ 01 мая 2019

Я определил модель данных для пакетов данных, но нужно определить UITableview разделы на основе

subscriptiontype = 'Yearly', 'Monthly', 'Weekly'

Получение ошибки - Невозможно присвоить значение типа '[Package]' для типа '[[String : String]]?'. Как я могу назначить его на разделы табличного представления.

Код:

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
}

Обновлены данные пакетаJson:

{ "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 ]

1 голос
/ 01 мая 2019

Модель

    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

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

Данные

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

1010 * Синтаксический *

    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, вы можете использовать данные сервера.

0 голосов
/ 01 мая 2019

Проблема в том, что вы пытаетесь присвоить объекту Package значение, которое ожидает массив словарей.

Ваша переменная data - это словарь, в котором ключом является TableSection, а массивом словарей является значение, которое вы определили, написав [[String: String]]. Затем в вашей функции sortData вы пытаетесь присвоить значение различным ключам данных, но вы назначаете ему элемент Package, когда он ожидает массив словарей.

Что будет работать, если вы измените определение данных на

var data = [TableSection: Package]()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...