En Objective-C, uno puede agregar un description
método a su clase para ayudar en la depuración:
@implementation MyClass
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@: %p, foo = %@>", [self class], foo _foo];
}
@end
Luego, en el depurador, puede hacer:
po fooClass
<MyClass: 0x12938004, foo = "bar">
¿Cuál es el equivalente en Swift? La salida REPL de Swift puede ser útil:
1> class MyClass { let foo = 42 }
2>
3> let x = MyClass()
x: MyClass = {
foo = 42
}
Pero me gustaría anular este comportamiento para imprimir en la consola:
4> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)
¿Hay alguna manera de limpiar esta println
salida? He visto el Printable
protocolo:
/// 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 }
}
Pensé que esto sería "visto" automáticamente, println
pero no parece ser el caso:
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)
Y en su lugar, tengo que llamar explícitamente a description:
8> println("x = \(x.description)")
x = MyClass, foo = 42
¿Hay una mejor manera?
Ejemplo de uso
CustomStringConvertible
yCustomDebugStringConvertible
protocolos en Swift:PageContentViewController.swift
ViewController.swift
Qué impresión:
Nota: si tiene una clase personalizada que no hereda de ninguna clase incluido en UIKit o Fundación bibliotecas, a continuación, hacer que hereda de la
NSObject
clase o que sea conforme conCustomStringConvertible
yCustomDebugStringConvertible
protocolos.fuente
Solo usa
CustomStringConvertible
yvar description: String { return "Some string" }
funciona en Xcode 7.0 beta
fuente
Las respuestas relacionadas
CustomStringConvertible
son el camino a seguir. Personalmente, para mantener la definición de clase (o estructura) lo más limpia posible, también separaría el código de descripción en una extensión separada:fuente
fuente
Como se describe aquí , también puede usar las capacidades de reflexión de Swift para hacer que sus clases generen su propia descripción mediante el uso de esta extensión:
fuente
fuente