Como posso modificar a saída textual que é exibida na interpolação de string?
O Printable
protocolo parece o mais óbvio, mas é ignorado na Interpolação de String e ao imprimir a instância, por exemplo:
struct Point : Printable
{
var x = 0
var y = 0
var description : String {
return "(\(x), \(y))"
}
func toString() -> String {
return description
}
}
Da mesma forma, a toString()
convenção também não tem efeito:
var p = Point(x: 10, y: 20)
println(p) // V11lldb_expr_05Point (has 2 children)
println("\(p)") // V11lldb_expr_05Point (has 2 children)
println(p.description) // (10, 20)
println("\(p.description)") // (10, 20)
O comportamento é diferente novamente em PlayGround, que usa sua própria representação String para estruturas, ou seja:
p // {x 10, y 20}
Existe uma maneira de alterar a forma como uma instância é exibida?
Respostas:
Swift 2 - 4
Resumo
Cumpra o
CustomStringConvertible
protocolo e adicionedescription
:Exemplo
Você pode criar algumas estruturas:
Se você inicializá-los:
As descrições personalizadas aparecerão em seu playground:
Veja também
CustomDebugStringConvertible
, que você pode usar para uma saída mais detalhada durante a depuração.Nota de Uso
Você pode inicializar um
String
de qualquer tipo sem implementar este protocolo. Por exemplo:Por esse motivo, os documentos dizem:
fonte
Documentos relevantes do Apple Swift
A Apple fornece este exemplo:
Se você tentar fazer isso no playground, terá o mesmo problema que está obtendo (
V11lldb_expr...
). No playground, você obtém a descrição no lado direito quando chama o inicializador, mas oprintln
não retorna algo legível.Fora do playground, no entanto, esse código se comporta conforme o esperado. Tanto seu código quanto o código de amostra da Apple acima imprimem o correto
description
quando usado em um contexto fora do playground.Eu não acho que você pode mudar esse comportamento no playground. Também pode ser apenas um bug.
EDIT : Tenho certeza de que isso é um bug; Enviei um relatório de bug para a Apple.
ATUALIZAR : No Swift 2, em vez de
Printable
, useCustomStringConvertible
( link do documento relevante ).fonte
Isso parece ser um bug no playground. Se você realmente compilar e executar o programa normalmente, ele imprimirá:
como esperado.
Você deve relatar isso em https://bugreport.apple.com
fonte
Se você abrir a visualização do console: Exibir -> Editor Assistente -> Mostrar Editor Assistente, você pode ver as linhas de impressão esperadas. Verificado no xCode 6.3.2 com Yosimite 10.10
fonte
Como alternativa no Swift 5+, você pode estender o String.StringInterpolation
Isso mudará o valor de,
print("\(p)")
mas não paraprint(p)
- que ainda usará a descriçãofonte
AppCode
fornece umGenerate| debugDescription
e `` Gerar | descrição ». Melhor do que digitá-los para uma estrutura com muitos membros.fonte