0Pricing
Swift Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. CustomStringConvertible
  2. CustomDebugStringConvertible
  3. Отражение с помощью Mirror
  4. Создание типов, удобных для отладки
← Назад к Swift Academy