Условная компиляция — это механизм, позволяющий включать или исключать части кода на этапе компиляции в зависимости от заданных условий. Это мощный инструмент для создания гибких и адаптируемых кодовых баз.
Компилятор обрабатывает директивы условной компиляции до начала собственно компиляции кода, выбирая какие участки кода должны быть включены в финальную сборку.
#if
/ #elseif
/ #else
/ #endif
— базовые условия#available
— проверка версии ОС#canImport
— проверка доступности фреймворка#targetEnvironment
— проверка окружения (simulator и др.)#if os(iOS)
import UIKit
#elseif os(macOS)
import AppKit
#endif
if #available(iOS 15.0, *) {
// Используем новые API для iOS 15+
} else {
// Фолбэк для старых версий
}
#if DEBUG
print("Debug logs enabled")
setupDebugTools()
#endif
Можно задавать в настройках проекта (Build Settings → Swift Compiler - Custom Flags)
#if FEATURE_A
enableFeatureA()
#endif
#if DEBUG && FEATURE_A
// Только для Debug с включенной фичей A
#endif
#if targetEnvironment(simulator)
// Код для симулятора
#endif
#if canImport(Combine)
import Combine
#endif
✅ Чистая кодовая база без runtime-проверок
✅ Уменьшение размера конечного бинарника
✅ Более предсказуемое поведение (условия проверяются на этапе компиляции)
✅ Возможность создания универсальных кросс-платформенных компонентов
❌ Усложняет чтение кода при чрезмерном использовании
❌ Требует аккуратного управления флагами компиляции
❌ Может привести к дублированию кода в разных ветках
Условная компиляция — важный инструмент в арсенале iOS-разработчика. Она позволяет создавать гибкие, адаптируемые решения, поддерживать кросс-платформенность и оптимизировать конечные бинарники. Однако важно использовать её обдуманно, чтобы не превратить код в сложноподдерживаемый лабиринт из директив. В Swift условная компиляция стала особенно мощной с появлением директив #available
и #canImport
.