Не удалось преобразовать значение типа '[[ModelName]?]' В ожидаемый тип аргумента '[ModelName] .Type' - PullRequest
0 голосов
/ 28 ноября 2018

Я создал класс модели из [https://jsonmaster.github.io/#][1] этой ссылки в кодируемом коде. Я получаю такую ​​ошибку. Невозможно преобразовать значение типа '[[BookingMasterModel]?]' В ожидаемый тип аргумента '[BookingMasterModel].Type 'На самом деле я очень новичок в этом, пожалуйста, поделитесь, если есть решение для этого

// MyOrdersModel

import Foundation

struct MyOrdersModel: Codable {

    let BookingMasterModel: [BookingMasterModel]?
    let RESPONSE: String?
    let RESID: String?

    private enum CodingKeys: String, CodingKey {
        case BookingMasterModel = "BookingMasterModel"
        case RESPONSE = "RESPONSE"
        case RESID = "RES_ID"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        BookingMasterModel = try values.decodeIfPresent([BookingMasterModel].self, forKey: .BookingMasterModel)
        RESPONSE = try values.decodeIfPresent(String.self, forKey: .RESPONSE)
        RESID = try values.decodeIfPresent(String.self, forKey: .RESID)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encodeIfPresent(BookingMasterModel, forKey: .BookingMasterModel)
        try container.encodeIfPresent(RESPONSE, forKey: .RESPONSE)
        try container.encodeIfPresent(RESID, forKey: .RESID)
    }

}

эта модель Мастер бронирования

import Foundation

struct BookingMasterModel: Codable {

    let AMOUNT: String?
    let APPTDATE: String?
    let CANCELLEDON: String?
    let COUNT: String?
    let DATE: String?
    let MOBILE: String?
    let NAMES: String?
    let ORDERBY: String?
    let ORDERMODE: String?
    let ORDERNO: String?
    let REMINDER: String?
    let SERVICEDON: String?
    let STATUS: String?

    private enum CodingKeys: String, CodingKey {
        case AMOUNT = "AMOUNT"
        case APPTDATE = "APPT_DATE"
        case CANCELLEDON = "CANCELLED_ON"
        case COUNT = "COUNT"
        case DATE = "DATE"
        case MOBILE = "MOBILE"
        case NAMES = "NAMES"
        case ORDERBY = "ORDER_BY"
        case ORDERMODE = "ORDER_MODE"
        case ORDERNO = "ORDER_NO"
        case REMINDER = "REMINDER"
        case SERVICEDON = "SERVICED_ON"
        case STATUS = "STATUS"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        AMOUNT = try values.decodeIfPresent(String.self, forKey: .AMOUNT)
        APPTDATE = try values.decodeIfPresent(String.self, forKey: .APPTDATE)
        CANCELLEDON = try values.decodeIfPresent(String.self, forKey: .CANCELLEDON)
        COUNT = try values.decodeIfPresent(String.self, forKey: .COUNT)
        DATE = try values.decodeIfPresent(String.self, forKey: .DATE)
        MOBILE = try values.decodeIfPresent(String.self, forKey: .MOBILE)
        NAMES = try values.decodeIfPresent(String.self, forKey: .NAMES)
        ORDERBY = try values.decodeIfPresent(String.self, forKey: .ORDERBY)
        ORDERMODE = try values.decodeIfPresent(String.self, forKey: .ORDERMODE)
        ORDERNO = try values.decodeIfPresent(String.self, forKey: .ORDERNO)
        REMINDER = try values.decodeIfPresent(String.self, forKey: .REMINDER)
        SERVICEDON = try values.decodeIfPresent(String.self, forKey: .SERVICEDON)
        STATUS = try values.decodeIfPresent(String.self, forKey: .STATUS)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encodeIfPresent(AMOUNT, forKey: .AMOUNT)
        try container.encodeIfPresent(APPTDATE, forKey: .APPTDATE)
        try container.encodeIfPresent(CANCELLEDON, forKey: .CANCELLEDON)
        try container.encodeIfPresent(COUNT, forKey: .COUNT)
        try container.encodeIfPresent(DATE, forKey: .DATE)
        try container.encodeIfPresent(MOBILE, forKey: .MOBILE)
        try container.encodeIfPresent(NAMES, forKey: .NAMES)
        try container.encodeIfPresent(ORDERBY, forKey: .ORDERBY)
        try container.encodeIfPresent(ORDERMODE, forKey: .ORDERMODE)
        try container.encodeIfPresent(ORDERNO, forKey: .ORDERNO)
        try container.encodeIfPresent(REMINDER, forKey: .REMINDER)
        try container.encodeIfPresent(SERVICEDON, forKey: .SERVICEDON)
        try container.encodeIfPresent(STATUS, forKey: .STATUS)
    }

}

1 Ответ

0 голосов
/ 28 ноября 2018

Я бы порекомендовал вам использовать вашу структуру без кодирования ключей, потому что протокол Codable может сделать это для вас.

Но ваша ошибка происходит из-за неправильного именования свойств структуры.Вы назвали свое свойство MyOrdersModel BookingMasterModel так же, как BookingMasterModel.Замените это имя переменной маленькой заглавной буквой.

let bookingMasterModel: [BookingMasterModel]?

и замените ключевое слово let всех свойств на var

var bookingMasterModel: [BookingMasterModel]?
var RESPONSE: String?
var RESID: String?

, сделайте то же самое в BookingMasterModel struct.

Теперь, наконец, удалите все ключи и элементы кодирования, чтобы упростить его.

struct MyOrdersModel: Codable {

    var bookingMasterModel: [BookingMasterModel]?
    var RESPONSE: String?
    var RESID: String?

}

struct BookingMasterModel: Codable {

    var AMOUNT: String?
    var APPTDATE: String?
    var CANCELLEDON: String?
    var COUNT: String?
    var DATE: String?
    var MOBILE: String?
    var NAMES: String?
    var ORDERBY: String?
    var ORDERMODE: String?
    var ORDERNO: String?
    var REMINDER: String?
    var SERVICEDON: String?
    var STATUS: String?
}

Примечание: вы можете узнать больше о соглашении об именах Swift здесь

...