Разница между Printable и DebugPrintable в Swift

Ищете быстрый эквивалент Cocoa description, я нашел следующие протоколы в Swift: Printable и DebugPrintable.

Какая разница между этими двумя протоколами и когда я должен использовать их?

Ответ 1

В XCode 6 Beta (версия 6.2 (6C101)) Я считаю, что и println, и debugPrintln используют описание if-and-only - если класс спускается из NSObject. Я не вижу, что либо использует debugDescription вообще, но при запуске на игровой площадке 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

Вот пример класса

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())

Ответ 3

Я считаю, что основное отличие - это свойство, которое использовалось для печати. Printable имеет description и DebugPrintable имеет debugDescription:

fooobar.com/info/171020/...

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

Edit:

По-видимому, 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/