У меня есть модель, которая является перечислением структур. Мне нужно согласовать это перечисление с Codable
.
import Foundation
enum Post: Codable {
case textPost(TextPost)
case imagePost(ImagePost)
case videoPost(VideoPost)
init(from decoder: Decoder) throws {
}
func encode(to encoder: Encoder) throws {
}
}
struct TextPost: Codable {
let documentID: String
let createdAt: Int
let organization: Organization
let title: String
let description: String
let commentTotal: Int
}
struct ImagePost: Codable {
let documentID: String
let createdAt: Int
let organization: Organization
let title: String
let description: String
let commentTotal: Int
let imageURL: String
}
struct VideoPost: Codable {
let documentID: String
let createdAt: Int
let organization: Organization
let title: String
let description: String
let commentTotal: Int
let videoURL: String
}
. Я использую Firestore из Firebase для хранения и извлечения данных.
Ранее при использовании простых struct
s я использовал следующее расширение для декодирования;
extension QueryDocumentSnapshot {
func decode() -> [String: Any] {
var data = self.data()
data["documentID"] = documentID
return data
}
}
extension JSONDecoder {
func decodeQuery<T>(_ type: T.Type, fromJSONObject object: Any) throws -> T where T: Decodable {
return try decode(T.self, from: try JSONSerialization.data(withJSONObject: object, options: []))
}
}
Я назвал это так:
func retrievePosts(success: @escaping([Post]) -> ()) {
var posts = [Post]()
reference(to: .posts).getDocuments { (snapshot, error) in
if error != nil {
print(error as Any)
return
} else {
guard let snapshotDocuments = snapshot?.documents else { return }
for snapshot in snapshotDocuments {
if let post = try? JSONDecoder().decodeQuery(Post.self, fromJSONObject: snapshot.decode()) {
posts.append(post)
}
}
}
}
}
Однако, это не работает на enum
s