我需要在Swift中的字符串插值中控制对象表示方式时实现哪个协议?
我想要指定类似于这样的输出中打印的内容:
struct A{
}
var a = A()
println("\(a)")
我需要在Swift中的字符串插值中控制对象表示方式时实现哪个协议?
我想要指定类似于这样的输出中打印的内容:
struct A{
}
var a = A()
println("\(a)")
您需要实现Printable
协议:
该协议适用于希望自定义其文本表示的类型。当对象被写入
OutputStreamType
时,将使用此文本表示。
protocol Printable {
var description: String { get }
}
当仅用于调试目的时,还有DebugPrintable
协议:
此协议应由希望自定义其文本表示形式以用于调试目的的类型采用。当对象写入
OutputStreamType
时,将使用此文本表示形式。
protocol DebugPrintable {
var debugDescription: String { get }
}
文档(感谢@MartinR)
注:正如评论中@Antonio和@MartinR所提到的,这在playground中不起作用(至少在Xcode6 GM中),这是已知的错误。它可以在编译的应用程序中使用。
从Xcode6 GM版本说明中:
在Playgrounds中,println()忽略了用户定义类型的Printable符合性。(16562388)
从Swift 2.0开始,Printable
现在变成了CustomStringConvertible
。一切都与以前相同,您仍然需要实现
var description: String { get }
现在它被称为CustomStringConvertible。而debug是CustomDebugStringConvertible。
struct Person {
var name: String
var age: Int
}
如果您想要添加一种特殊的字符串插值方式,以便我们可以以描述性方式打印人员信息,我们可以使用一个新的appendInterpolation()方法向String.StringInterpolation添加扩展。
extension String.StringInterpolation {
mutating func appendInterpolation(_ person: Person) {
appendInterpolation("My name is \(person.name) and I'm \(person.age) years old.")
}
}
let person = Person(name: "Yogendra", age: 28)
print("Person Details: \(person)")
输出结果将是:
Person Details: My name is Yogendra and I'm 28 years old.
StringInterpolationConvertible
。也就是说,实现该协议的任何类都可以从字符串插值构造。A
实例的字符串插值打印出什么,需要创建一个字符串扩展并重载init(stringInterpolationSegment expr: A)
函数。extension String {
init(stringInterpolationSegment expr: A) {
//do custom work here
//for example: self.init(expr.description)
}
}
Int
和Optional
。
__lldb_expr_551.Test
的东西。无论是否实现了Printable
。 - AntonioPrintable
(已知问题)。感谢你指出来。我已经编辑了答案以反映这一点。 - Mike S