Wie kann ich die Textausgabe ändern, die bei der Zeichenfolgeninterpolation angezeigt wird?
Das Printable
Protokoll sieht am offensichtlichsten aus, wird jedoch sowohl bei der Zeichenfolgeninterpolation als auch beim Drucken der Instanz ignoriert, z.
struct Point : Printable
{
var x = 0
var y = 0
var description : String {
return "(\(x), \(y))"
}
func toString() -> String {
return description
}
}
Ebenso hat die toString()
Konvention auch keine Wirkung:
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)
Das Verhalten ist in PlayGround wieder anders, das eine eigene String-Darstellung für Strukturen verwendet, dh:
p // {x 10, y 20}
Gibt es eine Möglichkeit, die Anzeige einer Instanz zu ändern?
Antworten:
Swift 2 - 4
Zusammenfassung
Passen Sie sich dem
CustomStringConvertible
Protokoll an und fügen Sie hinzudescription
:Beispiel
Sie können einige Strukturen erstellen:
Wenn Sie sie initialisieren:
Die benutzerdefinierten Beschreibungen werden auf Ihrem Spielplatz angezeigt:
Siehe auch
CustomDebugStringConvertible
, die Sie für eine ausführlichere Ausgabe während des Debuggens verwenden können.Verwendungshinweis
Sie können a
String
von jedem Typ aus initialisieren, ohne dieses Protokoll zu implementieren. Beispielsweise:Aus diesem Grund sagen die Dokumente:
quelle
Relevante Apple Swift-Dokumente
Apple bietet dieses Beispiel:
Wenn Sie dies auf dem Spielplatz versuchen, erhalten Sie das gleiche Problem wie bei (
V11lldb_expr...
). Auf dem Spielplatz erhalten Sie die Beschreibung auf der rechten Seite, wenn Sie den Initialisierer aufrufen, aber derprintln
gibt nichts Lesbares zurück.Außerhalb des Spielplatzes verhält sich dieser Code jedoch wie erwartet. Sowohl Ihr Code als auch der obige Beispielcode von Apple drucken den korrekten Code,
description
wenn er in einem Kontext außerhalb des Spielplatzes verwendet wird.Ich glaube nicht, dass Sie dieses Verhalten auf dem Spielplatz ändern können. Es könnte auch nur ein Fehler sein.
EDIT : Ich bin mir ziemlich sicher, dass dies ein Fehler ist; Ich habe einen Fehlerbericht an Apple gesendet.
UPDATE :
Printable
Verwenden Sie in Swift 2 stattdessenCustomStringConvertible
( relevanter Dokumentlink ).quelle
Dies scheint ein Fehler auf dem Spielplatz zu sein. Wenn Sie das Programm tatsächlich kompilieren und normal ausführen, wird Folgendes gedruckt:
wie erwartet.
Sie sollten dies unter https://bugreport.apple.com melden
quelle
Wenn Sie die Konsolenansicht öffnen: Ansicht -> Assistent-Editor -> Assistent-Editor anzeigen, werden die erwarteten Druckzeilen angezeigt, die in xCode 6.3.2 mit Yosimite 10.10 überprüft wurden
quelle
Alternativ können Sie in Swift 5+ die String.StringInterpolation erweitern
Dies ändert den Wert für,
print("\(p)")
aber nicht fürprint(p)
- wobei die Beschreibung weiterhin verwendet wirdquelle
AppCode
bietet einGenerate| debugDescription
und `` Generieren | Beschreibung`. Beats tippen sie für eine Struktur mit vielen Mitgliedern aus.quelle