2014-09-12 5 views
12

Welches Protokoll muss ich implementieren, um zu steuern, wie ein Objekt innerhalb einer String-Interpolation in Swift dargestellt wird?Swift-Protokoll für die String-Interpolation

I wan't zu spezifizieren, was in etwa wie folgt gedruckt werden ist:

struct A{ 

} 

var a = A() 
println("\(a)") 

Antwort

23

Sie müssen das Printable Protokoll implementieren:

Dieses Protokoll sollte von Arten angenommen werden, anpassen möchten ihre Textdarstellung. Diese textuelle Darstellung wird verwendet, wenn Objekte in eine OutputStreamType geschrieben werden.

protocol Printable { 
    var description: String { get } 
} 

Es gibt auch die DebugPrintable Protokoll, wenn es nur für Debugging-Zwecke ist:

Dieses Protokoll sollte von Arten angenommen werden, dass ihre Textdarstellung für Debugging-Zwecke verwendet anpassen möchten. Diese Textdarstellung wird verwendet, wenn Objekte in eine OutputStreamType geschrieben werden.

protocol DebugPrintable { 
    var debugDescription: String { get } 
} 

Documentation (Dank @MartinR)

Hinweis: Als @Antonio und @MartinR in den Kommentaren erwähnt, dies auf dem Spielplatz nicht funktioniert (Stand Xcode6 GM sowieso) ; das ist ein bekannter Fehler. Es funktioniert in kompilierten Apps.

Vom Xcode6 GM Release Notes:

In Spielplatz, println() ignoriert den Druck Konformität von benutzerdefinierten Typen. (16562388)

Ab Swift 2.0 Printable hat dich jetzt CustomStringConvertible. Alles bleibt gleich wie zuvor, Sie müssen noch implementieren

var description: String { get } 

Aber jetzt heißt es CustomStringConvertible. Und debug ist CustomDebugStringConvertible

+1

Bist Du sicher das funktioniert? ich dachte gleich, versuchte sich auf einem Spielplatz, und es zeigt so etwas wie '__lldb_expr_551. Test ". Unabhängig von" Printable "implementiert oder nicht – Antonio

+1

Auch dokumentiert hier: https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibr aryReferenz/Drucken.html. –

+1

Interessant. Es funktioniert in einer kompilierten App, aber nicht auf einem Spielplatz. –

1

Ich mag würde hier eine alternative Lösung setzen:

Das Protokoll für die String-Interpolation in Swift ist StringInterpolationConvertible. Das heißt, jede Klasse, die das Protokoll implementiert, kann aus einer String-Interpolation konstruiert werden.

Zurück zur Frage, um zu steuern, was für eine String-String-Interpolation von Instanzen der Klasse A ausgedruckt wird, müssten Sie eine String-Erweiterung erstellen und die init(stringInterpolationSegment expr: A)-Funktion überladen.

extension String { 
    init(stringInterpolationSegment expr: A) { 
     //do custom work here 
     //for example: self.init(expr.description) 
    } 
} 

Falls Sie nach einer Möglichkeit suchen, die lästige "Optional (...„), Wenn die optionalen Variablen interpolieren, was ich denke, der Hauptgrund, warum Menschen kontrollieren wollen würden, wie ein Objekt wird ausgedruckt, hat nur einen Blick auf dem pod NoOptionalInterpolation here

Zusätzliche Informationen (hrsg.): Bestätigen Sie, dass zwingende description wird nur für die eigene Struktur/Klasse arbeiten, aber nicht für bestehende Struktur/Klasse wie Int und Optional.