En Objective-C, on peut ajouter une description
méthode à leur classe pour aider au débogage:
@implementation MyClass
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@: %p, foo = %@>", [self class], foo _foo];
}
@end
Ensuite, dans le débogueur, vous pouvez faire:
po fooClass
<MyClass: 0x12938004, foo = "bar">
Quel est l'équivalent en Swift? La sortie REPL de Swift peut être utile:
1> class MyClass { let foo = 42 }
2>
3> let x = MyClass()
x: MyClass = {
foo = 42
}
Mais j'aimerais remplacer ce comportement pour l'impression sur la console:
4> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)
Existe-t-il un moyen de nettoyer cette println
sortie? J'ai vu le Printable
protocole:
/// 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 }
}
J'ai pensé que cela serait automatiquement "vu" par println
mais cela ne semble pas être le cas:
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)
Et à la place, je dois appeler explicitement description:
8> println("x = \(x.description)")
x = MyClass, foo = 42
Y a-t-il un meilleur moyen?
Exemple d'utilisation
CustomStringConvertible
et deCustomDebugStringConvertible
protocoles dans Swift:PageContentViewController.swift
ViewController.swift
Quelle impression:
Remarque: si vous avez une classe personnalisée qui n'hérite d'aucune classe incluse dans les bibliothèques UIKit ou Foundation , faites-la hériter de la
NSObject
classe ou rendez-la conforme aux protocolesCustomStringConvertible
etCustomDebugStringConvertible
.la source
Il suffit d'utiliser
CustomStringConvertible
etvar description: String { return "Some string" }
fonctionne dans Xcode 7.0 beta
la source
Les réponses concernant
CustomStringConvertible
sont la voie à suivre. Personnellement, pour garder la définition de classe (ou struct) aussi propre que possible, je séparerais également le code de description dans une extension distincte:la source
la source
Comme décrit ici , vous pouvez également utiliser les capacités de réflexion de Swift pour que vos classes génèrent leur propre description en utilisant cette extension:
la source
la source