Décodage des valeurs d'énumération Encodable inconnues par défaut

xxtesaxx

Je dois désérialiser une chaîne JSON comme ceci:

{ "name" : "John Smith", "value" : "someValue" }

dans Swift 4, où "value" doit être une énumération et l'objet entier est une structure comme:

struct MyType {
    name: String?
    value: Value?
}

À un moment donné dans le futur, de nouvelles valeurs d'énumération pourraient être ajoutées dans le backend, alors j'ai pensé qu'il serait judicieux d'avoir une solution de secours.

J'ai pensé que je pourrais créer une énumération comme

enum Value {
    case someValue
    case someOtherValue
    case unknown(value: String)
}

mais je ne peux tout simplement pas comprendre comment désérialiser cette énumération et la faire fonctionner. Auparavant, j'utilisais simplement une Stringénumération, mais la désérialisation des valeurs inconnues lève des erreurs.

Existe-t-il un moyen simple de faire fonctionner cela ou dois-je désérialiser la valeur en tant que a Stringet créer un getter personnalisé dans la structure avec une instruction switch pour renvoyer l'un des cas (probablement même pas dans la structure elle-même mais dans mon modèle de vue)?

PGDev

Vous pouvez implémenter init(from decoder: Decoder)et encode(to encoder: Encoder)gérer chaque cas explicitement, c'est-à-dire

struct MyType: Codable {
    var name: String?
    var value: Value?

    enum CodingKeys: String, CodingKey {
        case name
        case value
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        name = try values.decode(String.self, forKey: .name)
        let strValue = try values.decode(String.self, forKey: .value)
        //You need to handle every case explicitly
        switch strValue {
        case "someValue":
            value = Value.someValue
        case "someOtherValue":
            value = Value.someOtherValue
        default:
            value = Value.unknown(value: strValue)
        }
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(name, forKey: .name)
        if let val = value {
            //You need to handle every case explicitly
            switch val {
            case .someValue, .someOtherValue:
                try container.encode(String(describing: val), forKey: .value)
            case .unknown(let strValue):
                try container.encode(strValue, forKey: .value)
            }
        }
    }
}

enum Value {
    case someValue
    case someOtherValue
    case unknown(value: String)
}

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Jackson: ignorer les valeurs d'énumération inconnues

RestTemplate | Lecture des valeurs ENUM inconnues comme valeur par défaut

Valeurs d'énumération par défaut C # vs C

Linq obtient des lignes par des valeurs d'énumération

Liste des valeurs d'énumération inconnue

Modification des valeurs d'énumération

Comment analyser des paires clé / valeur (potentiellement inconnues) à partir d'une liste de chaînes avec des valeurs par défaut?

Cadre XML simple : revenir à la valeur par défaut pour les valeurs Enum inconnues

Ajout des valeurs par défaut firebase

Valeurs par défaut des champs Avro

Ajouter des valeurs par défaut à dataframe

Remplacement des valeurs par défaut avec la classe d'opération dans Swift 3

Énumérer les valeurs comme valeurs par défaut des paramètres dans Haxe

Obtenir les valeurs d'énumération par chaîne de nom d'énumération

Valeur par défaut d'énumération pour la valeur d'annotation d'énumération Java

Joindre des tables avec des valeurs d'énumération

Affichage des valeurs d'énumération à partir des fonctions

Obtenir des valeurs d'un dict par défaut

Déclaration des valeurs par défaut dans Config

django demande d'ajouter des valeurs par défaut

Énumération des sources de thèmes UWP par défaut

Java8 utilisant les valeurs d'énumération dans les méthodes par défaut de l'interface

Liste des valeurs d'énumération en java

Comparaison des valeurs d'énumération dans Flow

Stockage des valeurs d'énumération avec JPA

Abandon des valeurs d'énumération sans duplication

Liste des valeurs d'énumération lors de la compilation

Comment lancer un HashSet avec des valeurs d'énumération ?

Comment choisir des valeurs d'énumération complexes en Python

TOP liste

  1. 1

    Comment exécuter un fichier python avec des droits d'administrateur dans pycharm

  2. 2

    obtenir le nombre de marqueur affiché sur la carte

  3. 3

    comment obtenir un objet de requête dans les tests unitaires de django?

  4. 4

    Microsoft.WebApplication.targets

  5. 5

    Comment ajouter un texte dans un texte Python/Tkinter

  6. 6

    comment convertir une chaîne en un tuple dateutil jour de la semaine sans utiliser eval

  7. 7

    mongo kafka connect source

  8. 8

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  9. 9

    Dans les modèles Hugo, comment vérifier la longueur du tableau de fichiers JSON?

  10. 10

    Référencement des assemblys de structure .net 4.7 dans la solution .net core 2

  11. 11

    Comment obtenir tous les champs d'un objet (y compris sa superclasse), à l'aide de l'API Mirrors de Dart?

  12. 12

    Exécuter la requête externe pour chaque date obtenue à partir de la requête interne

  13. 13

    Recherche de dicton Jinja2 à l'aide d'une clé variable

  14. 14

    Laravel 8: Attempt to read property "id" on null

  15. 15

    définir une propriété pour chaque nœud dans neo4j

  16. 16

    Vérifier la longueur du nombre à partir du message, puis utiliser la valeur dans l'instruction

  17. 17

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  18. 18

    Aide de variable de débogage pprint jinja2

  19. 19

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  20. 20

    Impression de la longueur du chemin le plus court dans le labyrinthe

  21. 21

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

chaudétiquette

Archive