TGViewer
Мобильный трудоголик Мобильный трудоголик @hardworkerit · 1.64K subscribers
Post #341 1.22K
🔢 Swift: профессиональные методы отладки сложного кода.

Отладка - это не просто процесс поиска ошибок. Для опытного разработчика это системное исследование, где каждый баг становится ясной логической задачей. Разница между новичком, который часами ставит print, и сеньором, который за минуты находит корень проблемы, часто заключается не в опыте, а в знании правильных инструментов и методологии. Давайте разберем неочевидные, но мощные возможности Swift, которые меняют подход к диагностике.


Трюк с контекстом - почему ваши логи должны быть умнее print:

Стандартный print оставляет вас в неведении: где именно сработал этот вывод? Вместо этого используйте встроенные литералы компилятора для автоматического контекста:


func debugLog(
_ message: String,
file: String = #file,
function: String = #function,
line: Int = #line
) {
let fileName = URL(fileURLWithPath: file).lastPathComponent
print("[\(fileName):\(line)] \(function) — \(message)")
}


Такой подход сразу дает ответы на три ключевых вопроса: где (файл и строка), в чем (функция) и что (сообщение) произошло. Это особенно критично в асинхронном коде, где стек вызовов может быть обрезан.


Зеркало в runtime - когда нужно увидеть то, что скрыто:

Swift - статически типизированный язык, но это не значит, что мы не можем исследовать объекты в рантайме. Mirror - ваш портал для интроспекции. Допустим, у вас сложная ViewModel с десятком @Published свойств, и вы не понимаете, какое именно вызывает неожиданное обновление UI:


func inspectObject(_ object: Any) {
let mirror = Mirror(reflecting: object)
for child in mirror.children {
print("\(child.label ?? "Unknown"): \(type(of: child.value)) = \(child.value)")
}
}


Вы можете пройтись по любому объекту, будь то ваша ViewModel, состояние навигации или даже сложная конфигурация сервиса. Это незаменимо при анализе утечек памяти (когда нужно понять, что именно удерживает сильную ссылку) или при отладке сложных сериализаций.


dump() против print - анатомия сложных структур:

Когда print выдает что-то вроде User(address: __lldb_expr_123.Address(street: "...", ...)), пора переходить к dump(). Эта функция рекурсивно обходит всю структуру объекта, показывая его реальное дерево:


struct Project {
let title: String
let contributors: [Developer]
let settings: Configuration
}

let activeProject = fetchCurrentProject()
dump(activeProject) // Полное дерево со всеми вложенными объектами


Вы увидите не просто «есть массив разработчиков», а каждого разработчика со всеми его полями, и каждое поле конфигурации. Это спасение при работе с Core Data (исследование графа объектов), сложными JSON-ответами API или глубокими иерархиями UIView.


CustomDebugStringConvertible - создание отладочной документации:

Реализация CustomDebugStringConvertible - это не про красивый вывод. Это про создание специализированного отладочного представления для ваших типов, которое показывает именно ту информацию, которая важна для диагностики:


class NetworkRequest: CustomDebugStringConvertible {
let id: UUID
let endpoint: URL
var state: State
var metrics: [Metric]

var debugDescription: String {
"""
Request \(id.uuidString.prefix(8))...
to \(endpoint.path)
is \(state.rawValue)
last metric: \(metrics.last?.description ?? "none")
"""
}
}


Теперь, логгируя или используя po в LLDB, вы мгновенно видите статус запроса, а не просто его адрес в памяти. Это особенно эффективно для массивов или словарей таких объектов.


🔗 Ссылка на подробную статью


💡 Вывод:

Профессиональная отладка - это переход от борьбы со симптомами к глубокому пониманию логики системы. Применяя комплексный подход с контекстными логами, интроспекцией и проактивными проверками, вы превращаете неочевидные проблемы в ясные и решаемые задачи. Это меняет саму философию разработки, заставляя создавать код, который легче диагностировать с самого начала.


➡️ Подписаться на канал
Мобильный трудоголик
  • 🔥 20
  • ❤ 10
  • 👍 4
  • ✍ 1
  • 🙏 1
More from @hardworkerit
  1. Oct 2, 2026👣 Архитекторы, тестировщики и кодеры. Создаем мультиагентную команду Разработка с ИИ-аген…
  2. Oct 1, 2026🔢 Работа с Picture-in-Picture в iOS. Picture-in-Picture - системная функция iOS, которая…
  3. Sep 29, 2026🔢 Управление тулбарами на iPhone Duo. На iPhone Duo элементы управления навигацией, дейст…
  4. Sep 27, 2026🔢 Новые возможности Hashable в Swift 6.4 В Swift 6.4 добавили Hashable для нескольких тип…
  5. Sep 25, 2026🔢 Приватные свойства больше не ломают memberwise инициализатор в Swift 6.4 Swift автомати…
  6. Sep 24, 2026👨‍💻 Почему разработчики ненавидят своих менеджеров. Всем привет! Сегодня хочу разобрать…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →