gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:40:55 25 4
gpt4 key购买 nike

我有一个名为 Event 的类,我想让它可编码:

class Event: Codable {
let name: String
let action: String
let data: [String: Any]?

enum CodingKeys: String, CodingKey {
case name
case action
case data
}

init(name: String, action: String, data: [String: Any]?) {
self.name = name
self.action = action
self.data = data
}

required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
self.name = try values.decode(String.self, forKey: .name)
self.action = try values.decode(String.self, forKey: .action)
let eventDataAsJSONString = try values.decode(String.self, forKey: .data)
if let eventDataAsData = eventDataAsJSONString.data(using: .utf8) {
self.data = try? JSONSerialization.jsonObject(with: eventDataAsData, options: []) as? [String: Any]
} else {
self.data = nil
}
}

func encode(from encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.name, forKey: .name)
try container.encode(self.action, forKey: .action)
if let data = self.data {
let eventDataAsData = try! JSONSerialization.data(withJSONObject: data, options: [])
let eventDataAsJSONString = String(data: eventDataAsData, encoding: .utf8)
try container.encode(eventDataAsJSONString, forKey: .data)
} else {
try container.encodeNil(forKey: .data)
}
}
}

但我收到此错误:

Type 'Event' does not conform to protocol 'Encodable'

我实现了init(来自解码器:Decoder)encode(来自编码器:Encoder)。那么我在这里做错了什么?

我需要 [String:Any] 类型的 data 属性,因为我的用户需要用它存储一些类似 json 的信息。

最佳答案

这就是在 Codable 中使用 ANY 的方法

class Event<T: Codable>: Codable {
let name: String
let action: String
let data: [String: T]?

enum CodingKeys: String, CodingKey {
case name
case action
case data
}

init(name: String, action: String, data: [String: T]?) {
self.name = name
self.action = action
self.data = data
}

required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
self.name = try values.decode(String.self, forKey: .name)
self.action = try values.decode(String.self, forKey: .action)
let eventDataAsJSONString = try values.decode(String.self, forKey: .data)
if let eventDataAsData = eventDataAsJSONString.data(using: .utf8) {
self.data = try? JSONSerialization.jsonObject(with: eventDataAsData, options: []) as? [String: T]
} else {
self.data = nil
}
}

func encode(from encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.name, forKey: .name)
try container.encode(self.action, forKey: .action)
if let data = self.data {
let eventDataAsData = try! JSONSerialization.data(withJSONObject: data, options: [])
let eventDataAsJSONString = String(data: eventDataAsData, encoding: .utf8)
try container.encode(eventDataAsJSONString, forKey: .data)
} else {
try container.encodeNil(forKey: .data)
}
}
}


let event = Event<String>(name: "name", action: "action", data: ["String" : "String"]) // Replace <String> with the type u want and pass that in data

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com