如何修改字符串插值中显示的文本输出?
该Printable
协议看起来最明显,但在字符串插值和打印实例时都被忽略,例如:
struct Point : Printable
{
var x = 0
var y = 0
var description : String {
return "(\(x), \(y))"
}
func toString() -> String {
return description
}
}
Run Code Online (Sandbox Code Playgroud)
同样,该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)
Run Code Online (Sandbox Code Playgroud)
PlayGround中的行为再次不同,它使用自己的String表示结构,即:
p // {x 10, y 20}
Run Code Online (Sandbox Code Playgroud)
有没有办法可以改变实例的显示方式?
Aar*_*ger 104
符合CustomStringConvertible
协议并添加description
:
var description: String {
return "description here"
}
Run Code Online (Sandbox Code Playgroud)
您可以创建一些结构:
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)."
}
}
Run Code Online (Sandbox Code Playgroud)
如果你初始化它们:
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])
Run Code Online (Sandbox Code Playgroud)
自定义说明将显示在您的操场上:
另请参阅CustomDebugStringConvertible
,您可以在调试期间使用更详细的输出.
您可以在不实现此协议的情况下String
从任何类型初始化a .例如:
出于这个原因,文档说:
因此不鼓励使用
CustomStringConvertible
作为通用约束或description
直接访问符合类型.
Cez*_*cik 37
Apple提供了这个例子:
struct MyType: Printable {
var name = "Untitled"
var description: String {
return "MyType: \(name)"
}
}
let value = MyType()
println("Created a \(value)")
// prints "Created a MyType: Untitled"
Run Code Online (Sandbox Code Playgroud)
如果你在游乐场试试这个,你会遇到同样的问题(V11lldb_expr...
).在游乐场中,当您调用初始化程序时,您会在右侧获得描述,但println
不会返回清晰易读的内容.
但是,在游乐场外,此代码的行为与您期望的一样.description
当您在非游乐场环境中使用时,您的代码和Apple上面的示例代码都会正确打印.
我认为你不能在游乐场改变这种行为.它也可能只是一个错误.
编辑:我很确定这是一个错误; 我向Apple提交了一份错误报告.
更新:在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"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
28714 次 |
最近记录: |