Active Compilation Conditions — kompilyatora qurma mərhələsində ötürülən və müəyyən kod bloklarının son ikili fayla daxil edilməsini və ya xaric edilməsini təmin edən bayraqlardır. Apple Developer Documentation (2026)-ya görə, Swift Active Compilation Conditions-u OTHER_SWIFT_FLAGS açarı və #if direktivi vasitəsilə dəstəkləyir. Active Compilation Conditions tərtibatçılara icra vaxtı yoxlamaları olmadan sazlama, test və istehsal üçün kodun müxtəlif versiyalarını qurmağa imkan verir.
Əsas məqamlar
Active Compilation Conditions — qurma mərhələsində aktiv preprosessor direktivlərinin dəstini müəyyən edən kompilyasiya bayraqlarıdır. Runtime bayraqlarından ( if (isDebug) yoxlaması) fərqli olaraq, kompilyasiya şərtləri aktiv olmayan kodu ikili fayldan fiziki olaraq xaric edir, bu da performansı artırır və tətbiq ölçüsünü azaldır.
Mexanizm preprosessor və ya kompilyasiyanın ilkin mərhələləri səviyyəsində işləyir: kompilyator aktiv adların siyahısını alır və #if NAME direktivi ilə qarşılaşdıqda NAME-in bu siyahıda olub-olmadığını yoxlayır. Ad yoxdursa — blok daxilindəki kod nəzərə alınmır və kompilyasiya olunmur.
Swift.org Blog (2025)-a görə, Active Compilation Conditions-un runtime bayraqları əvəzinə istifadəsi geniş loqlama sistemi və sazlama alətləri olan layihələrdə release ikili faylının ölçüsünü orta hesabla 12-18% azaldır. Bu, xüsusilə quraşdırma faylının ölçüsü məhdud olan mobil tətbiqlər üçün vacibdir.
C/C++ preprosessoru səviyyəsində şərti kompilyasiyadan əsas fərq — Swift və Kotlin-də Active Compilation Conditions AST (Abstract Syntax Tree) səviyyəsində işləyir, mətn dəyişdirmə səviyyəsində deyil. Bu, onları daha təhlükəsiz və proqnozlaşdırıla bilən edir: #if-in aktiv olmayan qolunda istənilən sintaksis səhvi təhlil mərhələsində aşkarlanacaq, icra vaxtında üzə çıxmayacaq.
Digər vacib fərq — Swift-də #if os(iOS) || os(macOS) şərti kompilyasiya mərhələsində yoxlanılır və preprosessor makroları ilə deyil, platforma adları ilə işləyir. Bu, C/C++ preprosessorunda mümkün olan #define vasitəsilə səhv mtn daxil edilməsi ilə bağlı bütün səhv sinfini aradan qaldırır. Swift kompilyatoru dəyişdirilmiş mtn deyil, AST görür ki, bu da şərti kompilyasiyanın sazlamasını əhəmiyyətli dərəcədə asanlaşdırır.
Swift Active Compilation Conditions-u #if direktivi vasitəsilə dəstəkləyir. Bu direktiv &&, || və ! məntiqi operatorları ilə birləşdirilmiş bayraq adlarının siyahısını qəbul edir. Kompilyator #if ... #endif daxilindəki kodu yalnız şərt doğru olduqda daxil edir.
Swift bir neçə daxili şərt təmin edir: DEBUG (debug qurmasında avtomatik aktiv), swift(>=5.0) (kompilyator versiyasının yoxlanılması), canImport(UIKit) (modulun əlçatanlığının yoxlanılması) və targetEnvironment(simulator) (mühitin yoxlanılması). Bu şərtlər əlavə konfiqurasiya tələb etmir.
// Swift-in daxili şərtləri
#if DEBUG
print("Debug qurması — loqlama aktivdir")
#endif
#if canImport(UIKit)
import UIKit
let screen = UIScreen.main.bounds
#elseif canImport(AppKit)
import AppKit
let screen = NSScreen.main?.frame
#endif
Tərtibatçı Xcode-da OTHER_SWIFT_FLAGS Build Setting-i vasitəsilə öz bayraqlarını əlavə edə bilər. Bayraq -D prefiksi ilə göstərilir, məsələn -DBETA və ya -DANALYTICS_ENABLED. Müxtəlif konfiqurasiyalar (Debug, Release, Staging) üçün müxtəlif bayraq dəstləri təyin edilə bilər.
// BETA bayrağının işlənməsi
#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 şərtlərini dəstəkləyir: os(iOS), os(macOS), os(tvOS), os(watchOS), os(Linux), os(Windows). Bu şərtlər hədəf qurma platformasını yoxlayır və platforma-spesifik bloklarla bir neçə Apple platforması üçün ümumi kod yazmağa imkan verir.
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 ekosistemində Active Compilation Conditions BuildConfig sistemi, productFlavors və build.gradle.kts-də bayraqlar vasitəsilə tətbiq olunur. Kotlin-in dil səviyyəsində #if direktivinin birbaşa analoqu yoxdur, lakin alternativ mexanizmlər təmin edir.
Ən geniş yayılmış üsul — hər bayraq üçün buildConfigField əlavə etmək: buildConfigField("boolean", "BETA", "true"). Bu sahələr hər Build Variant üçün ayrıca BuildConfig sinfində yaradılır. DEBUG sahəsi artıq daxildir və debug qurmaları üçün avtomatik true-dur.
// build.gradle.kts
android {
buildTypes {
debug {
buildConfigField("boolean", "BETA", "true")
}
release {
buildConfigField("boolean", "BETA", "false")
}
}
}
// Kotlin kodunda istifadə
if (BuildConfig.BETA) {
enableBetaFeatures()
}
Gradle hər flavor üçün ayrıca sourceSets kataloqları yaratmağa imkan verir. Məsələn, src/demo/ və src/full/. Müxtəlif sourceSets-də eyni adlı siniflər müvafiq flavor qurularkən bir-birini əvəz edir. Bu, bayraqlardan daha güclü mexanizmdir, çünki bütöv sinifləri ləğv etmək olar.
// 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) üçün expect/actual direktivi mövcuddur. Bu direktiv ümumi koddə gözlənilən bəyannamələr elan etməyə və platforma tətbiqlərini təmin etməyə imkan verir. Bu, təsirinə görə Active Compilation Conditions-a analoji olan kompilyasiya səviyyəli mexanizmdir — aktiv olmayan kod uyğun olmayan platformalar üçün kompilyasiya olunmur.
Active Compilation Conditions dörd əsas ssenaridə tətbiq olunur: sazlama (loqlar, inspektorlar), A/B testi (funksiya bayraqları), platforma adaptasiyası (iOS/macOS ümumi kodu) və lisenziyalaşdırma (pulsuz/pullu versiyalar).
Ən geniş yayılmış ssenari — şərti loqlama. Debug qurmasında bütün loqlar konsola yazılır, release-də heç nə yazılmır. #if DEBUG və ya BuildConfig.DEBUG istifadəsi release ikili faylında heç bir loqqer çağırışının, hətta inlined olanların belə olmamasını təmin edir.
func logRequest(_ url: URL, _ statusCode: Int) {
#if DEBUG
Logger.debug("Request to \(url.absoluteString) returned \(statusCode)")
#endif
}
Yeni funksionallıq istehsal üçün hələ hazır deyilsə, lakin kodda artıq varsa, onu kompilyasiya bayrağı arxasında gizlətmək olar. Runtime feature flags-dən fərqli olaraq, kompilyasiya bayraqları tətbiqi yoxlamalarla yükləmir və istifadəçi tərəfindən aktivləşdirilə bilməz.
Active Compilation Conditions mülayim şəkildə istifadə edilməlidir. Həddindən artıq bayraq sayı kodu anlamağı çətinləşdirir: tərtibatçı hazırda hansı qolların kompilyasiya olunacağına əmin ola bilməz. Hər bayrağı README və ya xüsusi CONFIG.md faylında sənədləşdirmək tövsiyə olunur.
Paylanmış komanda ilə böyük layihələrdə CI-də bayraqların avtomatik validasiyasını tətbiq etmək faydalıdır. Hər pull request Active Compilation Conditions-un bütün mümkün kombinasiyaları ilə qurulmalıdır. Bu, aktiv olmayan bayraq altındakı kodun refaktoring səbəbindən sınmadığını və heç bir şərti kompilyasiya qolunun buraxılışa qədər yoxlanılmamış qalmadığını təmin edir. xcresulttool (iOS üçün) və Gradle Build Scan (Android üçün) kimi alətlər bu prosesi avtomatlaşdırmağa kömək edir.
Tez-tez verilən suallar
#if DEBUG — kompilyasiya direktividir: DEBUG aktiv deyilsə, blok daxilindəki kod ikili fayla düşmür. if (isDebug) — runtime yoxlaması: kod həmişə kompilyasiya olunur, şərt icra zamanı yoxlanılır. #if release qurmasında heç bir iz buraxmır.
Layihənin Build Settings-də Other Swift Flags (OTHER_SWIFT_FLAGS) tapın və bayraqla yeni sətir əlavə edin: -DMY_FLAG. Bayraq #if MY_FLAG direktivi üçün görünəcək. Debug və Release konfiqurasiyaları üçün müxtəlif bayraqlar təyin edə bilərsiniz.
Kotlin/JVM-də birbaşa analoq yoxdur. Bunun əvəzinə BuildConfig sahələri (icra zamanı yoxlama, lakin ProGuard istifadə olunmayan kodu silə bilər) istifadə olunur. Kotlin Multiplatform-da — bəyannamə səviyyəsində expect/actual direktivi.
Bəli, Swift məntiqi operatorları dəstəkləyir: #if DEBUG && BETA, #if os(iOS) || os(tvOS), #if !RELEASE. Şərtlər mürəkkəb məntiq üçün mötərizələrlə qruplaşdırıla bilər. AND və OR standart qısaqapanma qaydaları ilə işləyir.
SwiftUI ön baxışı ayrı prosesdə əsas targetdən fərqli bayraqlarla qurulur. DEBUG aktiv olmaya bilər. Həll yolu: ön baxış kodu üçün targetEnvironment(simulator) istifadə etmək və ya şərti məntiqi ayrı metodlara çıxarmaq.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun