Исках да направя част от приложението си офлайн, както моят клиент го поиска. Мъчих си мозъка да направя структурата си кодируема, така че да мога да запазя данните по подразбиране на потребителя, но винаги получавам тази грешка
Типът „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] офлайн за ограничено време, докато потребителят се върне онлайн.
UsersModel
. Трябва да отговаря и наCodable
. И когато работите с Codable, не присвоявайте стойности по подразбиране на свойствата (между другото това е лоша практика така или иначе). И изобщо не използвайтеNS...
типове колекции в Swift. - person vadian   schedule 07.03.2020