'Asymmetric Encoding/Decoding with Codable and Firestore?

I have the following struct:

struct Recipe: Codable {
    @DocumentID var id: String?
    var vegetarian: Bool?
    
    private enum CodingKeys: String, CodingKey {
        case id
        case vegetarian
    }
    
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        vegetarian = try container.decode(Bool.self, forKey: .vegetarian)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(id, forKey: .id)
        try container.encode(vegetarian, forKey: .vegetarian)
    }
}

I am trying to:

  • Decode only vegetarian
  • Encode both vegetarian and id

This is my data model:

docRef.getDocument { document, error in
            if let error = error as NSError? {
                self.errorMessage = "Error getting document: \(error.localizedDescription)"
            }
            else {
                if let document = document {
                    do {
                        self.recipe = try document.data(as: Recipe.self)
                        
                        let recipeFromFirestore = Recipe(
                            id: self.recipe!.id,
                            vegetarian: self.recipe!.vegetarian)
                        
                        self.recipes.append(recipeFromFirestore)
                    }
                    catch {
                        print("Error: \(error)")
                    }
                }
            }
        }

I'm getting the following error in my getDocument: Missing argument for parameter 'from' in call.

This error doesn't happen if I comment out my init(from decoder: Decoder) and func encode(to encoder: Encoder) in my struct. Should I be doing something different for this asymmetric encoding/decoding?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source