In Objective-C können Sie description
ihrer Klasse eine Methode hinzufügen , um das Debuggen zu erleichtern:
@implementation MyClass
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@: %p, foo = %@>", [self class], foo _foo];
}
@end
Dann können Sie im Debugger Folgendes tun:
po fooClass
<MyClass: 0x12938004, foo = "bar">
Was ist das Äquivalent in Swift? Die REPL-Ausgabe von Swift kann hilfreich sein:
1> class MyClass { let foo = 42 }
2>
3> let x = MyClass()
x: MyClass = {
foo = 42
}
Aber ich möchte dieses Verhalten beim Drucken auf der Konsole überschreiben:
4> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)
Gibt es eine Möglichkeit, diese println
Ausgabe zu bereinigen ? Ich habe das Printable
Protokoll gesehen:
/// This protocol should be adopted by types that wish to customize their
/// textual representation. This textual representation is used when objects
/// are written to an `OutputStream`.
protocol Printable {
var description: String { get }
}
Ich dachte, dies würde automatisch von "gesehen" werden, println
aber es scheint nicht der Fall zu sein:
1> class MyClass: Printable {
2. let foo = 42
3. var description: String { get { return "MyClass, foo = \(foo)" } }
4. }
5>
6> let x = MyClass()
x: MyClass = {
foo = 42
}
7> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)
Und stattdessen muss ich die Beschreibung explizit aufrufen:
8> println("x = \(x.description)")
x = MyClass, foo = 42
Gibt es einen besseren Weg?
Anwendungsbeispiel
CustomStringConvertible
undCustomDebugStringConvertible
Protokolle in Swift:PageContentViewController.swift
ViewController.swift
Welcher Ausdruck:
Hinweis: Wenn Sie eine benutzerdefinierte Klasse haben, die von keiner in UIKit- oder Foundation- Bibliotheken enthaltenen
NSObject
Klasse erbt, erben Sie sie von der Klasse oder passen Sie sie anCustomStringConvertible
undCustomDebugStringConvertible
Protokolle an.quelle
Verwenden Sie einfach
CustomStringConvertible
undvar description: String { return "Some string" }
funktioniert in Xcode 7.0 Beta
quelle
Die Antworten in Bezug auf
CustomStringConvertible
sind der richtige Weg. Um die Definition der Klasse (oder Struktur) so sauber wie möglich zu halten, würde ich den Beschreibungscode auch in eine separate Erweiterung aufteilen:quelle
quelle
Wie hier beschrieben , können Sie auch die Reflexionsfunktionen von Swift verwenden, damit Ihre Klassen mithilfe dieser Erweiterung eine eigene Beschreibung generieren:
quelle
quelle