我如何更改Swift中显示的文本表示forms?
如何修改在string插值中显示的文本输出?
Printable
协议看起来最明显,但在string插值和打印实例时忽略它,例如:
struct Point : Printable { var x = 0 var y = 0 var description : String { return "(\(x), \(y))" } func toString() -> String { return description } }
同样, toString()
约定也不起作用:
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)
PlayGround中的行为不同,它使用自己的string表示结构,即:
p // {x 10, y 20}
有没有办法改变一个实例的显示方式?
Swift 2&3
在Swift 2中, Printable
变成了CustomStringConvertible
。 例如,你可以创build一些结构:
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)." } }
如果你初始化它们:
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])
自定义描述将出现在您的操场上:
另请参阅CustomDebugStringConvertible
,您可以在debugging期间使用它来获取更详细的输出。
用法说明
您可以从任何types初始化一个String
而不用实现这个协议。 例如:
为此,文件说:
因此不鼓励使用
CustomStringConvertible
作为通用约束,或直接访问符合types的description
。
相关的Apple Swift Docs
苹果提供了这个例子:
struct MyType: Printable { var name = "Untitled" var description: String { return "MyType: \(name)" } } let value = MyType() println("Created a \(value)") // prints "Created a MyType: Untitled"
如果你在操场上试试这个,你会得到和你一样的问题( V11lldb_expr...
)。 在操场中,当您调用初始化程序时,您会在右侧获得描述,但是println
不会返回可读的内容。
然而,在游乐场外,这个代码的行为和你所期望的一样。 上面的Apple代码和示例代码在非操场环境中使用时都会打印正确的description
。
我不认为你可以在操场上改变这种行为。 这也可能只是一个错误。
编辑 :我敢肯定,这是一个错误; 我向苹果提交了一个错误报告。
更新 :在Swift 2中,而不是Printable
,使用CustomStringConvertible
( 相关文档链接 )。
struct MyType: CustomStringConvertible { var name = "Untitled" var description: String { return "MyType: \(name)" } } let value = MyType() println("Created a \(value)") // prints "Created a MyType: Untitled"
这似乎是在操场上的一个错误。 如果你真正编译并运行该程序,它会打印:
(10, 20) (10, 20) (10, 20) (10, 20)
如预期。
如果打开控制台视图:查看 – >助手编辑器 – >显示助理编辑器,您可以看到预期的打印行检查在xcode 6.3.2与Yosimite 10.10