125 votes

Existe-t-il un moyen d'imprimer joliment les dictionnaires Swift sur la console ?

NSDictionary *dictionary = @{@"A" : @"alfa",
                             @"B" : @"bravo",
                             @"C" : @"charlie",
                             @"D" : @"delta",
                             @"E" : @"echo",
                             @"F" : @"foxtrot"};
NSLog(@"%@", dictionary.description);

affiche ce qui suit sur la console :

{
    A = alfa;
    B = bravo;
    C = charlie;
    D = delta;
    E = echo;
    F = foxtrot;
}

let dictionary: [String : String] = ["A" : "alfa",
                                     "B" : "bravo",
                                     "C" : "charlie",
                                     "D" : "delta",
                                     "E" : "echo",
                                     "F" : "foxtrot"];
print(dictionary)

affiche ce qui suit sur la console :

["B": "bravo", "A": "alfa", "F": "foxtrot", "C": "charlie", "D": "delta", "E": "echo"]

Existe-t-il un moyen en Swift de lui faire imprimer des dictionnaires où chaque paire clé-valeur occupe une nouvelle ligne ?

10 votes

Vous pourriez utiliser dump par exemple, si le but est d'inspecter le dictionnaire. stackoverflow.com/documentation/swift/3966/logging-in-swift/

21 votes

print(dictionary as! NSDictionary) Un coup bas ?

0 votes

J'ai vraiment la suggestion de dump() puisqu'il n'y a pas besoin d'écrire de code ou de le couler. @EricAya, si vous postez une réponse avec cette remarque, je la marquerai comme étant la réponse.

159voto

Jalakoo Points 1748

L'attribution d'un dictionnaire à 'AnyObject' était la solution la plus simple pour moi :

let dictionary = ["a":"b",
                  "c":"d",
                  "e":"f"]
print("This is the console output: \(dictionary as AnyObject)")

this is the console output

C'est plus facile à lire pour moi que l'option dump, mais notez que cela ne vous donnera pas le nombre total de valeurs-clés.

15 votes

C'est une façon brillante et bien meilleure que la décharge.

0 votes

Il imprime les polices cyrilliques comme des nombres Unicode. \U0421\U0443\U043f\U0435\U0440 =(

157voto

Irshad Mohamed Points 558

solution po

Pour ceux d'entre vous qui veulent voir le dictionnaire en JSON sans la séquence d'échappement dans console Voici un moyen simple de le faire

(lldb) p print(String(data: try! JSONSerialization.data(withJSONObject: object, options: .prettyPrinted), encoding: .utf8 )!)

Mise à jour

Vérifiez aussi cette réponse Réponse :

1 votes

Puisqu'il s'agit d'une expression et non d'un objet, on devrait dire "p" et non "po". Mais merci beaucoup pour cette solution ! Cela fonctionne bien pour moi

0 votes

@AlessandroFrancucci est-ce important ? La commande semble faire la même chose dans les deux cas.

0 votes

Maintenant, les deux façons de faire fonctionnent. Mais avant de faire un "po print" n'a pas fonctionné pour moi. (po signifie print object.... ce qui est un peu confus si vous avez un print après et pas un objet imho)

119voto

Eric D. Points 16409

Vous pourriez utiliser déverser par exemple, si le but est d'inspecter le dictionnaire. dump fait partie de la bibliothèque standard de Swift.

Utilisation :

let dictionary: [String : String] = ["A" : "alfa",
                                     "B" : "bravo",
                                     "C" : "charlie",
                                     "D" : "delta",
                                     "E" : "echo",
                                     "F" : "foxtrot"]

dump(dictionary)

Sortie :

enter image description here


dump imprime le contenu d'un objet par réflexion (mirroring).

Vue détaillée d'un tableau :

let names = ["Joe", "Jane", "Jim", "Joyce"]
dump(names)

Imprimés :

4 éléments
- [0] : Joe
- [1] : Jane
- [2] : Jim
- [3] : Joyce

Pour un dictionnaire :

let attributes = ["foo": 10, "bar": 33, "baz": 42]
dump(attributes)

Imprimés :

3 paires clé/valeur
[0] : (2 éléments)
- .0 : barre
- .1 : 33
[1] : (2 éléments)
- .0 : baz
- .1 : 42
[2] : (2 éléments)
- .0 : foo
- .1 : 10

dump est déclaré comme dump(_:name:indent:maxDepth:maxItems:) .

Le premier paramètre n'a pas d'étiquette.

Il y a d'autres paramètres disponibles, comme name pour définir une étiquette pour l'objet inspecté :

dump(attributes, name: "mirroring")

Imprimés :

la mise en miroir : 3 paires clé/valeur
[0] : (2 éléments)
- .0 : barre
- .1 : 33
[1] : (2 éléments)
- .0 : baz
- .1 : 42
[2] : (2 éléments)
- .0 : foo
- .1 : 10

Vous pouvez également choisir de n'imprimer qu'un certain nombre d'éléments avec la fonction maxItems: pour analyser l'objet jusqu'à une certaine profondeur à l'aide de la fonction maxDepth: et pour changer l'indentation des objets imprimés avec indent: .

11 votes

Ce n'est pas du JSON joliment imprimé, c'est juste le vidage d'une variable dans la console - pas du JSON valide. Bien que cela réponde aux besoins de l'OP, je pense que la question doit être reformulée pour correspondre à cela.

7 votes

@JamesWolfe This is not pretty printed JSON Personne n'a dit que c'était le cas. L'OP a posé une question sur les dictionnaires Swift à imprimer - personne ne parle de JSON, sauf quelques personnes qui ont répondu hors sujet. La question de l'OP ne concerne pas du tout JSON.

1 votes

@JamesWolfe Veuillez également ne pas modifier la question. Ce serait du vandalisme. La question est claire comme elle est, et elle ne porte pas sur JSON. Ne modifiez pas une question juste parce que certaines réponses parlent d'autre chose. Merci.

41voto

Marco M Points 807

A des fins de débogage uniquement, je convertirais le tableau ou le dictionnaire en un json joliment imprimé :

public extension Collection {

    /// Convert self to JSON String.
    /// Returns: the pretty printed JSON string or an empty string if any error occur.
    func json() -> String {
        do {
            let jsonData = try JSONSerialization.data(withJSONObject: self, options: [.prettyPrinted])
            return String(data: jsonData, encoding: .utf8) ?? "{}"
        } catch {
            print("json serialization error: \(error)")
            return "{}"
        }
    }
}

Ensuite :

print("\nHTTP request: \(URL)\nParams: \(params.json())\n")

Résultat sur la console :

HTTP request: https://example.com/get-data
Params: {
  "lon" : 10.8663676,
  "radius" : 111131.8046875,
  "lat" : 23.8063882,
  "index_start" : 0,
  "uid" : 1
}

0 votes

qu'est-ce que c'est que bLog ici ?

0 votes

@Nitesh bLog est un simple logger personnalisé avec backtrace que j'ai écrit, édité avec print().

0 votes

La plus belle solution.

39voto

appzYourLife Points 10219

Une autre façon d'utiliser la programmation fonctionnelle

dictionary.forEach { print("\($0): \($1)") }

Sortie

B: bravo
A: alfa
F: foxtrot
C: charlie
D: delta
E: echo

1 votes

Cela devrait être la première réponse. Fonctionne parfaitement !

0 votes

Ou pour être "encore plus fonctionnel"... dictionnaire.map { "($0) : ($1)" }.forEach(print) (commentaire ironique)

3 votes

Cela fonctionne pour les OP [String: String] mais il n'est pas idéal pour [AnyHashable: Any] les dictionnaires, où si une valeur est un dictionnaire, on revient à l'impression non soignée de Swift.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X