CustomDebugStringConvertible
Предоставляйте расширенные отладочные данные.
«CustomDebugStringConvertible» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Отдельное представление для отладки
CustomDebugStringConvertible предоставляет debugDescription — представление, используемое функцией debugPrint, командой po в LLDB и отладчиком. Оно может быть более подробным, чем description.
Добавление debugDescription
Добавьте соответствие протоколу и предоставьте это свойство:
struct Point: CustomDebugStringConvertible {
let x: Int
let y: Int
var debugDescription: String { "Point(x: \(x), y: \(y))" }
}
debugPrint(Point(x: 1, y: 2)) // Point(x: 1, y: 2)debugPrint и print
print использует description, а debugPrint — debugDescription:
struct Money: CustomStringConvertible, CustomDebugStringConvertible {
let cents: Int
var description: String { "$\(Double(cents)/100)" }
var debugDescription: String { "Money(cents: \(cents))" }
}
let m = Money(cents: 250)
print(m) // $2.5
debugPrint(m) // Money(cents: 250)Когда предоставлять оба свойства
Используйте description для чистого пользовательского вывода, а debugDescription — для диагностических подробностей (raw-значений и внутреннего состояния). Предоставление обоих свойств позволяет получить лучшее представление для каждого контекста.
Больше подробностей при отладке
Показывайте внутренние детали, которые пользователи не должны видеть:
struct Session: CustomStringConvertible, CustomDebugStringConvertible {
let user: String
let token: String
var description: String { "Session(\(user))" }
var debugDescription: String { "Session(user: \(user), token: \(token))" }
}
let s = Session(user: "ann", token: "xyz")
print(s) // Session(ann)
debugPrint(s) // Session(user: ann, token: xyz)Отладочный вывод в коллекциях
debugPrint коллекции использует debugDescription каждого элемента:
struct Tag: CustomDebugStringConvertible {
let name: String
var debugDescription: String { "Tag(\(name))" }
}
debugPrint([Tag(name: "a"), Tag(name: "b")]) // [Tag(a), Tag(b)]String(reflecting:)
Подобно тому как String(describing:) использует description, String(reflecting:) использует debugDescription:
struct Code: CustomDebugStringConvertible {
let n: Int
var debugDescription: String { "Code<\(n)>" }
}
print(String(reflecting: Code(n: 7))) // Code<7>Поведение при отсутствии свойства
Если тип предоставляет только description, debugPrint использует его как запасной вариант. Если тип предоставляет только debugDescription, обычный print всё равно использует стандартное представление через Mirror:
struct Only: CustomStringConvertible {
let v: Int
var description: String { "Only(\(v))" }
}
debugPrint(Only(v: 3)) // Only(3) -- falls back to descriptionКавычки в отладочном выводе
Обратите внимание: debugPrint строки добавляет кавычки, что соответствует её отладочному назначению:
print("hi") // hi
debugPrint("hi") // "hi"Диагностика без утечки данных
Не включайте секреты в description, но допускайте их в debugDescription только в безопасных журналах. Осознанно выбирайте, какие сведения раскрывает каждое свойство.
struct Key: CustomStringConvertible {
let secret: String
var description: String { "Key(***)" }
}
print(Key(secret: "abc")) // Key(***)Отладочные подробности для перечисления
Для перечислений полезно debugDescription, раскрывающее исходный вариант и его данные:
enum Load: CustomDebugStringConvertible {
case idle
case progress(Int)
var debugDescription: String {
switch self {
case .idle: return "Load.idle"
case .progress(let p): return "Load.progress(\(p))"
}
}
}
debugPrint(Load.progress(40)) // Load.progress(40)Быстрая проверка
Какая функция использует debugDescription, а не description?
Итоги
Вы изучили CustomDebugStringConvertible:
- Предоставляйте
var debugDescription: Stringдля диагностического вывода - Используется функциями
debugPrint,String(reflecting:)и отладчиком printиспользуетdescription, аdebugPrint—debugDescription- Размещайте дополнительные внутренние сведения в отладочном представлении, а понятный текст — в description
Далее: отражение с помощью Mirror.
Часто задаваемые вопросы
Урок «CustomDebugStringConvertible» бесплатный?
Да — полный текст урока «CustomDebugStringConvertible» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «CustomDebugStringConvertible»?
Предоставляйте расширенные отладочные данные. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «CustomDebugStringConvertible»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- CustomStringConvertible
- CustomDebugStringConvertible
- Отражение с помощью Mirror
- Создание типов, удобных для отладки