Comment puis-je modifier la sortie textuelle qui s'affiche dans l'interpolation de chaîne?
Le Printable
protocole semble le plus évident mais il est ignoré à la fois dans l'interpolation de chaîne et lors de l'impression de l'instance, par exemple:
struct Point : Printable
{
var x = 0
var y = 0
var description : String {
return "(\(x), \(y))"
}
func toString() -> String {
return description
}
}
De même, la toString()
convention n'a aucun effet non plus:
var p = Point(x: 10, y: 20)
println(p) // V11lldb_expr_05Point (has 2 children)
println("\(p)") // V11lldb_expr_05Point (has 2 children)
println(p.description) // (10, 20)
println("\(p.description)") // (10, 20)
Le comportement est encore différent dans PlayGround qui utilise sa propre représentation String pour les structures, c'est-à-dire:
p // {x 10, y 20}
Existe-t-il un moyen de modifier la façon dont une instance est affichée?
Réponses:
Swift 2-4
Résumé
Conformez-vous au
CustomStringConvertible
protocole et ajoutezdescription
:Exemple
Vous pouvez créer des structures:
Si vous les initialisez:
Les descriptions personnalisées apparaîtront dans votre terrain de jeu:
Voir aussi
CustomDebugStringConvertible
, que vous pouvez utiliser pour une sortie plus détaillée pendant le débogage.Note d'utilisation
Vous pouvez initialiser un à
String
partir de n'importe quel type sans implémenter ce protocole. Par exemple:Pour cette raison, les documents disent:
la source
Documents Apple Swift pertinents
Apple fournit cet exemple:
Si vous essayez ceci dans le terrain de jeu, vous obtiendrez le même problème que celui que vous rencontrez (
V11lldb_expr...
). Dans la cour de récréation, vous obtenez la description sur le côté droit lorsque vous appelez l'initialiseur, maisprintln
ne renvoie rien de lisible.Hors du terrain de jeu, cependant, ce code se comporte comme vous vous en doutez. Votre code et l'exemple de code d'Apple ci-dessus impriment le correct
description
lorsqu'ils sont utilisés dans un contexte non-terrain de jeu.Je ne pense pas que vous puissiez changer ce comportement dans la cour de récréation. Cela pourrait aussi être juste un bug.
EDIT : Je suis presque sûr que c'est un bug; J'ai soumis un rapport de bogue à Apple.
MISE À JOUR : Dans Swift 2, au lieu de
Printable
, utilisezCustomStringConvertible
( lien vers la documentation pertinente ).la source
Cela semble être un bug dans la cour de récréation. Si vous compilez et exécutez le programme normalement, il imprime:
comme prévu.
Vous devez le signaler sur https://bugreport.apple.com
la source
Si vous ouvrez la vue de la console: Affichage -> Assistant Editor -> Show Assistant Editor, vous pouvez voir les lignes d'impression attendues Checked in xCode 6.3.2 with Yosimite 10.10
la source
Comme alternative dans Swift 5+, vous pouvez étendre la chaîne.
Cela changera la valeur pour
print("\(p)")
mais pas pourprint(p)
- qui utilisera toujours la descriptionla source
AppCode
fournit unGenerate| debugDescription
et `` Generate | description ». Beats les taper pour une structure avec de nombreux membres.la source