我如何更改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) 

如预期。

你应该在https://bugreport.apple.com上报告;

如果打开控制台视图:查看 – >助手编辑器 – >显示助理编辑器,您可以看到预期的打印行检查在xcode 6.3.2与Yosimite 10.10

在这里输入图像说明