寻找Swift等效的Cocoa description
,我在Swift中找到了以下协议:Printable
和DebugPrintable
。
这两个协议之间的区别是什么?我应该何时使用每个协议?
答案 0 :(得分:19)
这是一个示例类
class Foo: Printable, DebugPrintable {
var description: String {
return "Foo"
}
var debugDescription: String {
return "debug Foo"
}
}
这是如何使用它。
println(Foo())
debugPrintln(Foo())
这是输出,没有任何意外:
Foo
debug Foo
我没有在游乐场尝试这个。它适用于实际项目。
上面的答案是针对Swift 1.当时是正确的。
更新Swift 2。
println和debugPrintln消失,协议已重命名。
class Foo: CustomStringConvertible, CustomDebugStringConvertible {
var description: String {
return "Foo"
}
var debugDescription: String {
return "debug Foo"
}
}
print(Foo())
debugPrint(Foo())
答案 1 :(得分:4)
在Xcode 6 Beta(版本6.2(6C101))中,我发现println和debugPrintln都使用了if-and-only-if,如果该类来自NSObject。我根本没有看到使用debugDescription,但是当在Playground中运行时,debugPrintln仅输出到控制台,并且不会出现在游乐场本身。
import Foundation
class Tdesc: NSObject, Printable, DebugPrintable {
override var description: String {return "A description"}
override var debugDescription: String {return "A debugDescription"}
}
class Xdesc: Printable, DebugPrintable {
var description: String {return "A description"}
var debugDescription: String {return "A debugDescription"}
}
let t = Tdesc()
let x = Xdesc()
t.description
let z: String = "x\(t)"
println(t) // Displays "A description" in the Playground and Console
debugPrintln(t) // Displays nothing in the Playground but "A description" in the Console
x.description
let y: String = "x\(x)"
println(x) // Displays "__lldb_expr_405.Xdesc" in the Playground and Console
debugPrintln(x)
答案 2 :(得分:0)
我认为主要区别在于用于打印的属性。 Printable
有description
,DebugPrintable
有debugDescription
:
https://stackoverflow.com/a/24254220/887210
修改强>
显然print()和println()在Printable和DebugPrintable中无法正常工作:
struct TestPrintable : Printable {
var description: String { return "Testing Printable" }
}
struct TestDebugPrintable : DebugPrintable {
var debugDescription: String { return "Testing DebugPrintable" }
}
println(TestPrintable()) // -> "__lldb_expr_42.TestPrintable"
println(TestDebugPrintable()) // -> "__lldb_expr_42.TestDebugPrintable"
有关此内容的更多信息:
http://vperi.com/2014/06/04/textual-representation-for-classes-in-swift/