¿Cómo puedo modificar la salida textual que se muestra en la interpolación de cadenas?
El Printable
protocolo parece el más obvio, pero se ignora tanto en la Interpolación de cadenas como al imprimir la instancia, por ejemplo:
struct Point : Printable
{
var x = 0
var y = 0
var description : String {
return "(\(x), \(y))"
}
func toString() -> String {
return description
}
}
Asimismo, la toString()
convención tampoco tiene efecto:
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)
El comportamiento es diferente nuevamente en PlayGround, que usa su propia representación de cadena para estructuras, es decir:
p // {x 10, y 20}
¿Hay alguna forma de cambiar la forma en que se muestra una instancia?
Respuestas:
Rápido 2-4
Resumen
Cumplir con el
CustomStringConvertible
protocolo y agregardescription
:Ejemplo
Puedes crear algunas estructuras:
Si los inicializa:
Las descripciones personalizadas aparecerán en su área de juegos:
Consulte también
CustomDebugStringConvertible
, que puede utilizar para obtener resultados más detallados durante la depuración.Nota de uso
Puede inicializar un
String
desde cualquier tipo sin implementar este protocolo. Por ejemplo:Por esta razón, los docs dicen:
fuente
Documentos relevantes de Apple Swift
Apple proporciona este ejemplo:
Si prueba esto en el patio de recreo, obtendrá el mismo problema que está obteniendo (
V11lldb_expr...
). En el patio de recreo, obtienes la descripción en el lado derecho cuando llamas al inicializador, peroprintln
no devuelve algo legible.Sin embargo, fuera del patio de recreo, este código se comporta como era de esperar. Tanto su código como el código de muestra de Apple anterior imprimen lo correcto
description
cuando se usan en un contexto que no es un patio de juegos.No creo que puedas cambiar este comportamiento en el patio de recreo. También podría ser un error.
EDITAR : Estoy bastante seguro de que esto es un error; Envié un informe de error a Apple.
ACTUALIZACIÓN : En Swift 2, en lugar de
Printable
, useCustomStringConvertible
( enlace de documento relevante ).fuente
Esto parece ser un error en el patio de recreo. Si realmente compila y ejecuta el programa normalmente, imprime:
como se esperaba.
Debe informar esto en https://bugreport.apple.com
fuente
Si abre la vista de la consola: Ver -> Editor asistente -> Mostrar editor asistente, puede ver las líneas de impresión esperadas Verificado en xCode 6.3.2 con Yosimite 10.10
fuente
Como alternativa en Swift 5+, puede extender String.StringInterpolation
Esto cambiará el valor de
print("\(p)")
pero no deprint(p)
, que seguirá usando la descripciónfuente
AppCode
proporciona unGenerate| debugDescription
y `` Generar | descripción`. Es mejor que escribirlos para una estructura con muchos miembros.fuente