¿Cómo puedo cambiar la representación textual mostrada para un tipo en Swift?

¿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?

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:

enter image description here

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:

enter image description here

Por esta razón, los documentos dicen:

CustomStringConvertible tanto, se CustomStringConvertible usar CustomStringConvertible como una restricción genérica o acceder directamente a la description un tipo conforme.

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" 

Esto parece ser un error en el patio de recreo. Si realmente comstack y ejecuta el progtwig 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

enter image description here