Тип ‘MenuItem’ не соответствует протоколу ‘Decodable’

#ios #swift

#iOS #swift

Вопрос:

Почему я получаю сообщение об ошибке: Тип ‘MenuItem’ не соответствует протоколу ‘Decodable’? Раньше это работало. Одной из вещей, которые я изменил, были модификаторы из [String]? к [Модификатору]? Это приводит к ошибке? Если да, то почему? Stackoverflow хочет, чтобы я продолжал говорить, потому что это слишком маленькое описание по сравнению с объемом кода, который я отобразил ниже. Все еще требуется добавить текст.

 struct MenuItem: Codable {

let itemId: String
let name: String
var modifiers: [Modifier]?
var photoUrl: String?
var quantity: Int
var unitPrice: Int
var sizeAddOnPrice: Int
var toppingsAddOnPrice: Int
var totalPrice: Int
var totalModifiersPrice: Int
let description: String
var size: String
var toppings: [String]?
let category: String

init(itemId: String, name: String, modifiers: [Modifier]?, photoUrl: String?, quantity: Int, unitPrice: Int, sizeAddOnPrice: Int, toppingsAddOnPrice: Int, totalPrice: Int, totalModifiersPrice: Int, description: String, size: String, toppings: [String]?, category: String) {
    self.itemId = itemId
    self.name = name
    self.modifiers = modifiers
    self.photoUrl = photoUrl
    self.quantity = quantity
    self.unitPrice = unitPrice
    self.sizeAddOnPrice = sizeAddOnPrice
    self.toppingsAddOnPrice = toppingsAddOnPrice
    self.totalPrice = totalPrice
    self.totalModifiersPrice = totalModifiersPrice
    self.description = description
    self.size = size
    self.toppings = toppings
    self.category = category
}

init?(itemId: String, payload: JSON) {
    guard
        let name = payload[ParamKey.name].string,
        let photoUrl = payload[ParamKey.photoUrl].string,
        let description = payload[ParamKey.description].string,
        let category = payload[ParamKey.categoryName].string,
        let unitPrice = payload[ParamKey.basePrice].int,
        let size = payload[ParamKey.size].string
        else { return nil }
    self.itemId = itemId
    self.name = name
    self.photoUrl = photoUrl
    self.description = description
    self.category = category
    self.unitPrice = unitPrice
    self.size = size
    self.sizeAddOnPrice = 0
    self.toppings = nil
    self.toppingsAddOnPrice = 0
    self.totalPrice = (unitPrice   sizeAddOnPrice   toppingsAddOnPrice) * quantity
    self.totalModifiersPrice = (sizeAddOnPrice   toppingsAddOnPrice) * 2
    self.quantity = 1
    self.modifiers = payload[ParamKey.modifiers].arrayObject as? [Modifier]
    }
}
  

Комментарии:

1. Swift может автоматически генерировать весь код для Codable тогда и только тогда, когда все его поля Codable тоже. Очевидно, что Modifier это не Codable .

2. Вы пытались добавить Decodable протокол в MenuItem и все еще получали эту ошибку?

Ответ №1:

Вам также нужно привести внутренние структуры в соответствие с Decodable / Codable и удалить struct init , который будет автоматически сгенерирован

 struct Modifier: Codable {
    // add properties 
} 
struct MenuItem: Codable {

    let itemId: String
    let name: String
    var modifiers: [Modifier]?
    var photoUrl: String?
    var quantity: Int
    var unitPrice: Int
    var sizeAddOnPrice: Int
    var toppingsAddOnPrice: Int
    var totalPrice: Int
    var totalModifiersPrice: Int
    let description: String
    var size: String
    var toppings: [String]?
    let category: String

    init?(itemId: String, payload: JSON) {
        guard
            let name = payload[ParamKey.name].string,
            let photoUrl = payload[ParamKey.photoUrl].string,
            let description = payload[ParamKey.description].string,
            let category = payload[ParamKey.categoryName].string,
            let unitPrice = payload[ParamKey.basePrice].int,
            let size = payload[ParamKey.size].string
            else { return nil }
        self.itemId = itemId
        self.name = name
        self.photoUrl = photoUrl
        self.description = description
        self.category = category
        self.unitPrice = unitPrice
        self.size = size
        self.sizeAddOnPrice = 0
        self.toppings = nil
        self.toppingsAddOnPrice = 0
        self.totalPrice = (unitPrice   sizeAddOnPrice   toppingsAddOnPrice) * quantity
        self.totalModifiersPrice = (sizeAddOnPrice   toppingsAddOnPrice) * 2
        self.quantity = 1
        self.modifiers = payload[ParamKey.modifiers].arrayObject as? [Modifier]
    }
}
  

Вы также можете использовать

 try content.rawData() // for payload: JSON) {
  

для JSON получения данных и последующей передачи их в Decodable класс