ios - 类型 'MenuItem' 不符合协议(protocol) 'Decodable'

标签 ios swift

为什么我会收到错误消息:类型“MenuItem”不符合协议(protocol)“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]
    }
}

最佳答案

您还需要使内部结构符合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

关于ios - 类型 'MenuItem' 不符合协议(protocol) 'Decodable',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55164558/

相关文章:

ios - UINAvigationController -> setViewControllers 导致崩溃

ios - 具有大型 JSON 响应的 AFNetworking 2.0

ios - 如何将 TableView 单元格从最新到最旧而不是从最旧到最新排序

swift - 在 Swift 中使用模板键入别名声明

ios - UIStackView 在 Swift 中没有成员委托(delegate)错误

ios - 将注释应用于 map 工具包

php - JSON 请求发送空数据(swift)

iphone - iOS 5 中的规范音频样本数据类型是什么

swift - 在 swift3 中不使用 Uiimageview 更改 UIImage 颜色

swift - SQLite数据库错误: The FMDatabase <FMDatabase: 0x6080000a96c0> is not open.