есть много опций, стандарт соответствует надлежащим быстрым протоколам
struct S {
let a: Int
}
let s = S(a: 1)
print(s, String(describing: s), String(reflecting: s))
extension S: TextOutputStreamable {
func write<Target>(to target: inout Target) where Target : TextOutputStream {
target.write("TextOutputStreamable")
}
}
extension S: CustomStringConvertible {
var description: String {
"CustomStringConvertible"
}
}
extension S: CustomDebugStringConvertible {
var debugDescription: String {
"CustomDebugStringConvertible"
}
}
результат печати показывает, как различные протоколы имеют приоритет
TextOutputStreamable CustomStringConvertible CustomDebugStringConvertible
удаляет расширения и печатает
S(a: 1) S(a: 1) __lldb_expr_1.S(a: 1)
удалить расширения один за другим и посмотреть ...: -)
что насчёт Any?
let a: Any = s
print(a, String(describing: a), String(reflecting: a))
отпечатков
TextOutputStreamable TextOutputStreamable CustomDebugStringConvertible
давайте попробуем [Any]
print([a], String(describing: [a]), String(reflecting: [a]))
, и результат будет
[CustomDebugStringConvertible] [CustomDebugStringConvertible] [CustomDebugStringConvertible]