Типът грешка на Swift „BookingDataModel“ не съответства на протокола „Decodable“

Исках да направя част от приложението си офлайн, както моят клиент го поиска. Мъчих си мозъка да направя структурата си кодируема, така че да мога да запазя данните по подразбиране на потребителя, но винаги получавам тази грешка

Типът „BookingDataModel“ не отговаря на протокола „Decodable“

Ето моят BookingDataModal:

struct BookingDataModel: Codable {

    static var shared = BookingDataModel()

    var collaps = false
    var _id = ""
    var userId = ""
    var venderName = ""
    var created_at = ""
    var transaction_id = ""
    var payment_method = ""
    var updated_at = ""
    var booking_confirmed = false
    var booking_status = ""
    var payment_status = false
    var type = ""
    var isCanceledRequest: Bool?

    var flight: [FlightBookingDataModel]?
    var newFlight: (departure: [FlightBookingDataModel], return: [FlightBookingDataModel])?
    var event: HotelBookingDataModel?
    var hotel: NewHotelBookingDataModel?//HotelBookingDataModel?

    var isAxaPolicy = false
    var relationshipId = ""
    var passengers = [UsersModel]()
    var total = 0.0
    var tacCoinDiscount: Int?
    var couponDiscount: Int?
    var afterDiscountAmount: Int?

     func getBookingDataModel(arr: NSArray, type: String) -> [BookingDataModel] {
    // save data from API
    }
    }

Отначало си помислих, че другите ми модали не могат да се кодират, така че ги направих всички Кодируеми и пак щеше да изведе същата грешка. Ето FlightBookingDataModal:

struct FlightBookingDataModel: Codable {

    static var shared = FlightBookingDataModel()

    var pnrData = PNRDataModel()
    var src_name = ""
    var dst_name = ""
    var srcCode = ""
    var dstCode = ""

    var atime_utc = String()
    var dtime_utc = String()
    var atime = String()
    var dtime = String()

    var flight_no = ""
    var checkin = ""
    var price = 0.0
    var airLineName = ""
    var eticket_link = ""
    var invoice = ""
    var isReturnFlight = false

    func getFlightBookigDataModel(dict: NSDictionary) -> [FlightBookingDataModel] {
    // Save data from API
    }
    }

PNR модал:

class PNRDataModel: Codable  {
  var src = ""
  var dst = ""
  var iata = ""
  var pnr = ""
  }

HotelBookingDataModel:

struct HotelBookingDataModel: Codable {

    var cityName = ""
    var name = ""
    var address = ""
    var startOfServiceTime = ""
    var endOfServiceTime = ""
    var aetherReference = ""
    var provider = ""
    var reference = ""
    var price = 0.0
    var date = ""
    var reservationId = ""
    }

NewHotelBookingDataModel:

struct NewHotelBookingDataModel: Codable {
    var name = ""
    var address = ""
    var cityName = ""
    var price = 0.0
    var reference = ""
    var provider = "" //not found in new response
    var startOfServiceTime = ""
    var endOfServiceTime = ""
    var aetherReference = ""
    }

Ако някой може да ми даде някаква представа защо това не работи, това ще ми помогне много. Просто искам да запазя [BookingDataModal] офлайн за ограничено време, докато потребителят се върне онлайн.


person Akshay Raina    schedule 07.03.2020    source източник
comment
Има UsersModel. Трябва да отговаря и на Codable. И когато работите с Codable, не присвоявайте стойности по подразбиране на свойствата (между другото това е лоша практика така или иначе). И изобщо не използвайте NS... типове колекции в Swift.   -  person vadian    schedule 07.03.2020
comment
Здравей, vadian, UsersModal също отговаря на Codable, просто забравих да го публикувам в подробностите. Не знам къде бъркам. Благодаря за съветите, аз съм нов в разработката на iOS и наистина мога да използвам някои насоки   -  person Akshay Raina    schedule 07.03.2020


Отговори (1)


Причината за грешката е свойството newFlight в BookingDataModel.

Codable не поддържа кортежи.

person vadian    schedule 07.03.2020