Swift中Printable和DebugPrintable的区别

时间:2014-09-05 11:57:35

标签: cocoa swift protocols

寻找Swift等效的Cocoa description,我在Swift中找到了以下协议:PrintableDebugPrintable

这两个协议之间的区别是什么?我应该何时使用每个协议?

3 个答案:

答案 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)

我认为主要区别在于用于打印的属性。 PrintabledescriptionDebugPrintabledebugDescription

https://stackoverflow.com/a/24254220/887210

https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/Printable.html#//apple_ref/doc/uid/TP40014608-CH11-SW1

修改

显然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/