Ищете быстрый эквивалент Cocoa description
, я нашел следующие протоколы в Swift: Printable
и DebugPrintable
.
Какая разница между этими двумя протоколами и когда я должен использовать их?
Ищете быстрый эквивалент Cocoa description
, я нашел следующие протоколы в Swift: Printable
и DebugPrintable
.
Какая разница между этими двумя протоколами и когда я должен использовать их?
В 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)
Вот пример класса
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())
Я считаю, что основное отличие - это свойство, которое использовалось для печати. Printable
имеет description
и DebugPrintable
имеет debugDescription
:
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/