Objc.io a fait un excellent exposé sur la mutation facile des dictionnaires non typés, mais le problème est que vous ne pouvez pas les faire persister facilement. Je pense que l'exposé a peut-être été publié avant @dynamicMemberLookup
a été introduit.
AnyCodable semble génial pour coder/décoder/persister facilement des dictionnaires simples, mais vous ne pouvez pas accéder facilement aux membres du dictionnaire.
Je me demandais s'il était possible/réalisable d'ajouter @dynamicMemberLookup
que l'on trouve dans Swift 4.2 (par exemple, dans la fonction cet exemple ) à AnyCodable et, si oui, comment ? L'objectif final serait d'accéder à un tableau ou un dictionnaire non typé et de le modifier. et les faire persister.
Alors, j'ai essayé de faire comme ça :
@dynamicMemberLookup
public struct AnyCodable: Codable {
public let value: Any
public init<T>(_ value: T?) {
self.value = value ?? ()
}
subscript(dynamicMember member: String) -> AnyCodable? {
switch self.value {
case let dictionary as [String: Any?]:
return AnyCodable(dictionary[member])
default:
return nil
}
}
}
Compte tenu de l'exemple du dictionnaire de AnyCodable
:
let dictionary: [String: AnyEncodable] = [
"boolean": true,
"integer": 1,
"double": 3.14159265358979323846,
"string": "string",
"array": [1, 2, 3],
"nested": [
"a": "alpha",
"b": "bravo",
"c": "charlie"
]
]
Si je le fais :
if let nested = dictionary["nested"] {
print("nested a:", nested.a)
}
qu'il produit : nested a: Optional(AnyCodable(Optional("alpha")))
qui est presque terminé ! Mais je veux être capable d'écrire simplement dictionary?.nested?.a
OU dictionary?.array?[1]
plutôt que de déballer nested
d'abord avec if let nested = dictionary["nested"]
. Y Je veux pouvoir le faire muter, par exemple : dictionary?.nested?.a? = "beta"
.
Mais je n'arrive pas à trouver comment lui faire franchir la ligne d'arrivée. J'aurais évidemment besoin d'ajouter case let array as [Any]:
etc. et peut-être changer l'indice pour inclure les getter/setters ? Mais qu'est-ce qui me manque encore ?
Je sais que vous n'êtes probablement pas "censé utiliser les dictionnaires de cette façon" et créer un modèle personnalisé complet et tout cela, mais il s'agit d'un petit projet où cette voie serait trop compliquée. Ne répondez donc pas par "modélisez vos données différemment". Je veux combiner ces deux méthodes existantes d'accès et de persistance des dictionnaires ou des tableaux non typés en une seule.