假设我有一些 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 中的“类型”属性来告诉 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 会导致编译器错误
Expression pattern of type 'TextMessage.Type' cannot match values of type 'Message.Type'
- 是否有规范/可接受的方式来处理这种情况?为什么函数 getType 编译时这里的 init 不编译?