gpt4 book ai didi

ios - 当 JSON 输入表示 Codable 类型的多个子类时使用 Codable

转载 作者:行者123 更新时间:2023-11-30 12:15:20 28 4
gpt4 key购买 nike

假设我有一些 JSON,如下所示:

{ 
"some-random-key": {
"timestamp": 1234123423
"type": "text",
"content": "Hello!"
},

"some-other-key": {
"timestamp": 21341412314
"type": "image",
"path": "/path/to/image.png"
}
}

此 JSON 代表两个消息对象。这是我想如何表示它们(Swift 4):

class Message: Codable {
let timestamp: Int
// ...codable protocol methods...
}

class TextMessage: Message { // first message should map to this class

let content: String

// ...other methods, including overridden codable protocol methods...
}

class ImageMessage: Message { // second message should map to this class
let path: String

// ...other methods, including overridden codable protocol methods...
}

如何使用 JSON 中的“type”属性来告诉 Codable 要初始化哪个子类?我的第一直觉是使用枚举作为中介,这将允许我在字符串表示和元类型之间切换

enum MessageType: String {
case image = "image"
case text = "text"

func getType() -> Message.Type {
switch self {
case .text: return TextMessage.self
case .image: return ImageMessage.self
}
}

init(type: Message.Type) {
switch type {
case TextMessage.self: self = .text
case ImageMessage.self: self = .image
default: break
}
}
}

但是,这里的init会导致编译错误-
“TextMessage.Type”类型的表达式模式无法匹配“Message.Type”类型的值
是否有规范/公认的方法来处理这种情况?为什么 getType 函数编译时这里的 init 编译不了?

最佳答案

我会采用这种方法:

static func createMessage(with json: [String: Any]) -> Message? {
guard let typeString = json["type"] as? String,
let type = MessageType(rawValue: typeString) else { return nil }
switch type {
case .image: return ImageMessage(....

等等

关于ios - 当 JSON 输入表示 Codable 类型的多个子类时使用 Codable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45498751/

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