How can I modify the textual output that gets displayed in string interpolation?
The Printable
protocol looks the most obvious but it's ignored in both String Interpolation and when printing the instance, e.g:
struct Point : Printable { var x = 0 var y = 0 var description : String { return "(\(x), \(y))" } func toString() -> String { return description } }
Likewise the toString()
convention has no effect either:
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)
The behavior is different again in PlayGround which uses its own String representation for structs, i.e:
p // {x 10, y 20}
Is there a way I can change how an instance is displayed?
Conform to the CustomStringConvertible
protocol and add description
:
var description: String { return "description here" }
You can create some structs:
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)." } }
If you initialize them:
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])
The custom descriptions will appear in your playground:
See also CustomDebugStringConvertible
, which you can use for more verbose output during debugging.
You can initialize a String
from any type without implementing this protocol. For example:
For this reason, the docs say:
Using
CustomStringConvertible
as a generic constraint, or accessing a conforming type'sdescription
directly, is therefore discouraged.
Relevant Apple Swift Docs
Apple provides this example:
struct MyType: Printable { var name = "Untitled" var description: String { return "MyType: \(name)" } } let value = MyType() println("Created a \(value)") // prints "Created a MyType: Untitled"
If you try this in playground, you will get the same issue that you're getting (V11lldb_expr...
). In playground, you get the description on the right hand side when you call the initializer, but the println
doesn't return something legible.
Out of playground, however, this code behaves as you would expect. Both your code and the sample code from Apple above print the correct description
when used in a non-playground context.
I don't think you can change this behavior in playground. It could also just be a bug.
EDIT: I'm pretty sure that this is a bug; I submitted a bug report to Apple.
UPDATE: In Swift 2, instead of Printable
, use CustomStringConvertible
(relevant doc link).
struct MyType: CustomStringConvertible { var name = "Untitled" var description: String { return "MyType: \(name)" } } let value = MyType() println("Created a \(value)") // prints "Created a MyType: Untitled"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With