color - settitle swift
¿Cómo puedo cambiar la representación textual mostrada para un tipo en Swift? (4)
Swift 2 - 4
Resumen
Conforme al protocolo CustomStringConvertible
y añada una description
:
var description: String {
return "description here"
}
Ejemplo
Puedes crear algunas estructuras:
struct Animal : CustomStringConvertible {
let type : String
var description: String {
return type
}
}
struct Farm : CustomStringConvertible {
let name : String
let animals : [Animal]
var description: String {
return "/(name) is a /(self.dynamicType) with /(animals.count) animal(s)."
}
}
Si los inicializas:
let oldMajor = Animal(type: "Pig")
let boxer = Animal(type: "Horse")
let muriel = Animal(type: "Goat")
let orwellsFarm = Farm(name: "Animal Farm", animals: [oldMajor, boxer, muriel])
Las descripciones personalizadas aparecerán en tu patio de recreo:
Consulte también CustomDebugStringConvertible
, que puede usar para una salida más detallada durante la depuración.
Nota de uso
Puede inicializar una String
de cualquier tipo sin implementar este protocolo. Por ejemplo:
Por esta razón, los documentos dicen:
CustomStringConvertible
tanto, seCustomStringConvertible
usarCustomStringConvertible
como una restricción genérica o acceder directamente a ladescription
un tipo conforme.
¿Cómo puedo modificar la salida textual que se muestra en la interpolación de cadenas?
El protocolo Printable
parece el más obvio, pero se ignora tanto en la interpolación de cadenas como en la impresión de la instancia, por ejemplo:
struct Point : Printable
{
var x = 0
var y = 0
var description : String {
return "(/(x), /(y))"
}
func toString() -> String {
return description
}
}
Del mismo modo, la convención toString()
tampoco tiene ningún 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 cadenas para estructuras, es decir:
p // {x 10, y 20}
¿Hay alguna manera de cambiar la forma en que se muestra una instancia?
Esto parece ser un error en el patio de recreo. Si realmente compila y ejecuta el programa normalmente imprime:
(10, 20)
(10, 20)
(10, 20)
(10, 20)
como se esperaba.
Debe informar esto en https://bugreport.apple.com
Si abre la vista de consola: Ver -> Editor Asistente -> Mostrar Editor Asistente, puede ver las líneas de impresión esperadas Incorporado xCode 6.3.2 con Yosimite 10.10
Documentos relevantes de Apple Swift
Apple proporciona este ejemplo:
struct MyType: Printable {
var name = "Untitled"
var description: String {
return "MyType: /(name)"
}
}
let value = MyType()
println("Created a /(value)")
// prints "Created a MyType: Untitled"
Si prueba esto en el patio de recreo, obtendrá el mismo problema que está recibiendo ( V11lldb_expr...
). En el patio de recreo, obtienes la descripción en el lado derecho cuando llamas al inicializador, pero la println
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 ejemplo de Apple anterior imprimen la description
correcta cuando se usan en un contexto que no se relaciona con el patio de recreo.
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
, use CustomStringConvertible
( enlace de documentación relevante ).
struct MyType: CustomStringConvertible {
var name = "Untitled"
var description: String {
return "MyType: /(name)"
}
}
let value = MyType()
println("Created a /(value)")
// prints "Created a MyType: Untitled"