No Objective-C, pode-se adicionar um description
método à sua classe para ajudar na depuração:
@implementation MyClass
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@: %p, foo = %@>", [self class], foo _foo];
}
@end
Em seguida, no depurador, você pode:
po fooClass
<MyClass: 0x12938004, foo = "bar">
Qual é o equivalente em Swift? A saída REPL da Swift pode ser útil:
1> class MyClass { let foo = 42 }
2>
3> let x = MyClass()
x: MyClass = {
foo = 42
}
Mas eu gostaria de substituir esse comportamento para imprimir no console:
4> println("x = \(x)")
x = C11lldb_expr_07MyClass (has 1 child)
Existe uma maneira de limpar essa println
saída? Eu vi o 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 }
}
Imaginei que isso seria automaticamente "visto" por, println
mas não parece ser o 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)
E, em vez disso, tenho que chamar explicitamente a descrição:
8> println("x = \(x.description)")
x = MyClass, foo = 42
Existe uma maneira melhor?
Exemplo de uso
CustomStringConvertible
eCustomDebugStringConvertible
protocolos no Swift:PageContentViewController.swift
ViewController.swift
Que imprimir:
Nota: se você tiver uma classe personalizada que não herdar de qualquer classe incluído no UIKit ou Fundação bibliotecas, em seguida, torná-lo herdar de
NSObject
classe ou torná-lo em conformidade comCustomStringConvertible
eCustomDebugStringConvertible
protocolos.fonte
Basta usar
CustomStringConvertible
evar description: String { return "Some string" }
funciona no Xcode 7.0 beta
fonte
As respostas relacionadas
CustomStringConvertible
são o caminho a percorrer. Pessoalmente, para manter a definição de classe (ou estrutura) o mais limpa possível, eu também separaria o código de descrição em uma extensão separada:fonte
fonte
Conforme descrito aqui , você também pode usar os recursos de reflexão do Swift para fazer com que suas classes gerem sua própria descrição usando esta extensão:
fonte
fonte