Active Compilation Conditions — bu kompilyatorga qurish bosqichida uzatiladigan va ma'lum kod bloklarini yakuniy binar faylga kiritish yoki chiqarib tashlash imkonini beruvchi bayroqlardir. Apple Developer Documentation (2026) ma'lumotlariga ko'ra, Swift Active Compilation Conditions ni OTHER_SWIFT_FLAGS kaliti va #if direktivasi orqali qo'llab-quvvatlaydi. Active Compilation Conditions dasturchilarga ishga tushirish vaqti tekshiruvlarisiz kodning turli versiyalarini nosozliklarni tuzatish, test va ishlab chiqarish uchun yig'ish imkonini beradi.
Asosiy ma'lumotlar
Active Compilation Conditions — qurish bosqichida faol preprosessor direktivalari to'plamini aniqlaydigan kompilyatsiya bayroqlari. Runtime bayroqlaridan (if (isDebug) tekshiruvi) farqli o'laroq, kompilyatsiya shartlari faol bo'lmagan kodni binar fayldan jismoniy ravishda chiqarib tashlaydi, bu esa ishlashni yaxshilaydi va ilova hajmini kamaytiradi.
Mexanizm preprosessor yoki kompilyatsiyaning dastlabki bosqichlari darajasida ishlaydi: kompilyator faol nomlar ro'yxatini oladi va #if NAME direktivasiga duch kelganda NAME ushbu ro'yxatda bor yoki yo'qligini tekshiradi. Agar nom bo'lmasa — blok ichidagi kod e'tiborga olinmaydi va kompilyatsiya qilinmaydi.
Swift.org Blog (2025) ma'lumotlariga ko'ra, Active Compilation Conditions dan runtime bayroqlari o'rniga foydalanish rivojlangan loglash tizimi va nosozliklarni tuzatish vositalariga ega loyihalarda release binar fayli hajmini o'rtacha 12-18% ga kamaytiradi. Bu, ayniqsa, o'rnatish fayli hajmi cheklangan mobil ilovalar uchun juda muhimdir.
C/C++ preprosessori darajasidagi shartli kompilyatsiyadan asosiy farq — Swift va Kotlin dagi Active Compilation Conditions AST (Abstract Syntax Tree) darajasida ishlaydi, matnli almashtirish darajasida emas. Bu ularni xavfsizroq va bashorat qilinadigan qiladi: #if ning faol bo'lmagan tarmog'idagi har qanday sintaksis xatosi tahlil bosqichida aniqlanadi va ishga tushirish vaqtida namoyon bo'lmaydi.
Yana bir muhim farq — Swift da #if os(iOS) || os(macOS) sharti kompilyatsiya bosqichida tekshiriladi va preprosessor makrolari bilan emas, balki platforma nomlari bilan ishlaydi. Bu C/C++ preprosessorida mumkin bo'lgan #define orqali matnni noto'g'ri kiritish bilan bog'liq xatolarning butun sinfini yo'q qiladi. Swift kompilyatori almashtirilgan matnni emas, balki AST ni ko'radi, bu shartli kompilyatsiyani tuzatishni sezilarli darajada osonlashtiradi.
Swift Active Compilation Conditions ni #if direktivasi orqali qo'llab-quvvatlaydi. U &&, || va ! mantiqiy operatorlari bilan birlashtirilgan bayroq nomlari ro'yxatini qabul qiladi. Kompilyator #if ... #endif ichidagi kodni faqat shart to'g'ri bo'lganda kiritadi.
Swift bir nechta o'rnatilgan shartlarni taqdim etadi: DEBUG (debug yig'ishda avtomatik faol), swift(>=5.0) (kompilyator versiyasini tekshirish), canImport(UIKit) (modul mavjudligini tekshirish) va targetEnvironment(simulator) (muhitni tekshirish). Bu shartlar qo'shimcha sozlashni talab qilmaydi.
// Swift ning o'rnatilgan shartlari
#if DEBUG
print("Debug yig'ish — loglash faol")
#endif
#if canImport(UIKit)
import UIKit
let screen = UIScreen.main.bounds
#elseif canImport(AppKit)
import AppKit
let screen = NSScreen.main?.frame
#endif
Dasturchi Xcode da OTHER_SWIFT_FLAGS Build Setting i orqali o'z bayroqlarini qo'shishi mumkin. Bayroq -D prefiksi bilan ko'rsatiladi, masalan -DBETA yoki -DANALYTICS_ENABLED. Turli konfiguratsiyalar (Debug, Release, Staging) uchun turli bayroq to'plamlari o'rnatilishi mumkin.
// BETA bayrog'ini qayta ishlash
#if BETA
let apiEndpoint = "https://beta.api.com"
let isLoggingEnabled = true
#else
let apiEndpoint = "https://api.com"
let isLoggingEnabled = false
#endif
func trackEvent(_ name: String) {
#if ANALYTICS_ENABLED
Analytics.log(name)
#endif
}
Swift platforma shartlarini qo'llab-quvvatlaydi: os(iOS), os(macOS), os(tvOS), os(watchOS), os(Linux), os(Windows). Bu shartlar maqsadli qurish platformasini tekshiradi va platforma-spesifik bloklar bilan bir nechta Apple platformalari uchun umumiy kod yozish imkonini beradi.
import Foundation
func getDeviceName() -> String {
#if os(iOS)
return UIDevice.current.name
#elseif os(macOS)
return Host.current.name ?? "Unknown"
#else
return "Other platform"
#endif
}
Android ekotizimida Active Compilation Conditions BuildConfig tizimi, productFlavors va build.gradle.kts dagi bayroqlar orqali amalga oshiriladi. Kotlin til darajasida #if direktivasining to'g'ridan-to'g'ri analogiga ega emas, ammo muqobil mexanizmlarni taqdim etadi.
Eng keng tarqalgan usul — har bir bayroq uchun buildConfigField qo'shish: buildConfigField("boolean", "BETA", "true"). Bu maydonlar har bir Build Variant uchun alohida BuildConfig sinfida yaratiladi. DEBUG maydoni allaqachon o'rnatilgan va debug yig'ishlari uchun avtomatik ravishda true hisoblanadi.
// build.gradle.kts
android {
buildTypes {
debug {
buildConfigField("boolean", "BETA", "true")
}
release {
buildConfigField("boolean", "BETA", "false")
}
}
}
// Kotlin kodida foydalanish
if (BuildConfig.BETA) {
enableBetaFeatures()
}
Gradle har bir flavor uchun alohida sourceSets kataloglarini yaratishga imkon beradi. Masalan, src/demo/ va src/full/. Turli sourceSets dagi bir xil nomli sinflar tegishli flavor qurilganda bir-birini almashtiradi. Bu bayroqlardan kuchliroq mexanizm, chunki butun sinflarni bekor qilish mumkin.
// src/demo/java/com/example/Config.kt
object Config {
const val API_URL = "http://demo.api.com"
const val IS_BETA = true
}
// src/full/java/com/example/Config.kt
object Config {
const val API_URL = "https://full.api.com"
const val IS_BETA = false
}
Kotlin Multiplatform (KMP) uchun expect/actual direktivi mavjud bo'lib, u umumiy kodda kutilgan deklaratsiyalarni e'lon qilish va platforma implementatsiyalarini taqdim etish imkonini beradi. Bu kompilyatsiya darajasidagi mexanizm bo'lib, ta'siri bo'yicha Active Compilation Conditions ga o'xshaydi — faol bo'lmagan kod mos kelmaydigan platformalar uchun kompilyatsiya qilinmaydi.
Active Compilation Conditions to'rtta asosiy stsenariyda qo'llaniladi: nosozliklarni tuzatish (loglar, inspektorlar), A/B test (funksiya bayroqlari), platforma moslashuvi (iOS/macOS umumiy kodi) va litsenziyalash (bepul/pulli versiyalar).
Eng keng tarqalgan stsenariy — shartli loglash. Debug yig'ishda barcha loglar konsolga yoziladi, release da — hech narsa. #if DEBUG yoki BuildConfig.DEBUG dan foydalanish release binar faylida hech qanday logger chaqiruvi, hatto inline qilinganlarining ham yo'qligini kafolatlaydi.
func logRequest(_ url: URL, _ statusCode: Int) {
#if DEBUG
Logger.debug("Request to \(url.absoluteString) returned \(statusCode)")
#endif
}
Agar yangi funksionallik ishlab chiqarish uchun hali tayyor bo'lmasa, lekin kodda allaqachon mavjud bo'lsa, uni kompilyatsiya bayrog'i orqasida yashirish mumkin. Runtime feature flags dan farqli o'laroq, kompilyatsiya bayroqlari ilovani tekshiruvlar bilan yuklamaydi va foydalanuvchi tomonidan yoqilmaydi.
Active Compilation Conditions mo''tadil ishlatilishi kerak. Haddan tashqari ko'p bayroqlar kodni tushunishni qiyinlashtiradi: dasturchi hozirgi vaqtda qaysi tarmoqlar kompilyatsiya qilinishiga ishonch hosil qila olmaydi. Har bir bayroqni README yoki maxsus CONFIG.md faylida hujjatlashtirish tavsiya etiladi.
Katta loyihalarda taqsimlangan jamoa bilan CI da bayroqlarni avtomatik tekshirishni joriy qilish foydalidir. Har bir pull request Active Compilation Conditions ning barcha mumkin bo'lgan kombinatsiyalari bilan qurilishi kerak. Bu faol bo'lmagan bayroq ostidagi kod qayta tuzish sababli buzilmaganligini va hech qanday shartli kompilyatsiya tarmog'i relizgacha tekshirilmagan holda qolmaganligini kafolatlaydi. xcresulttool (iOS uchun) va Gradle Build Scan (Android uchun) kabi vositalar bu jarayonni avtomatlashtirishga yordam beradi.
Tez-tez so'raladigan savollar
#if DEBUG — bu kompilyatsiya direktivasi: DEBUG faol bo'lmasa, blok ichidagi kod binar faylga tushmaydi. if (isDebug) — runtime tekshiruvi: kod har doim kompilyatsiya qilinadi, shart bajarilish vaqtida tekshiriladi. #if release yig'ishda hech qanday iz qoldirmaydi.
Loyihaning Build Settings ida Other Swift Flags (OTHER_SWIFT_FLAGS) ni toping va bayroq bilan yangi qator qo'shing: -DMY_FLAG. Bayroq #if MY_FLAG direktivasiga ko'rinadi. Debug va Release konfiguratsiyalari uchun turli bayroqlarni o'rnatishingiz mumkin.
Kotlin/JVM da to'g'ridan-to'g'ri analog yo'q. Buning o'rniga BuildConfig maydonlari (runtime tekshiruvi, lekin ProGuard ishlatilmagan kodni olib tashlashi mumkin) ishlatiladi. Kotlin Multiplatform da — deklaratsiyalar darajasida expect/actual direktivasi.
Ha, Swift mantiqiy operatorlarni qo'llab-quvvatlaydi: #if DEBUG && BETA, #if os(iOS) || os(tvOS), #if !RELEASE. Shartlarni murakkab mantiq uchun qavslar bilan guruhlash mumkin. AND va OR standart qisqa tutashuv qoidalari bilan ishlaydi.
SwiftUI oldindan ko'rish asosiy targetdan farqli bayroqlar bilan alohida jarayonda quriladi. DEBUG faol bo'lmasligi mumkin. Yechim: oldindan ko'rish kodi uchun targetEnvironment(simulator) dan foydalaning yoki shartli mantiqni alohida metodlarga chiqaring.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.