Az Active Compilation Conditions olyan jelzők, amelyeket a fordítónak adunk át a build fázisban, és lehetővé teszik bizonyos kódblokkok be- vagy kizárását a végső bináris fájlból. A Apple Developer Documentation (2026) szerint a Swift az Active Compilation Conditions-t az OTHER_SWIFT_FLAGS kulcson és a #if direktíván keresztül támogatja. Active Compilation Conditions lehetővé teszik a fejlesztők számára, hogy a kód különböző verzióit hozzák létre hibakereséshez, teszteléshez és éles használathoz futásidejű ellenőrzések nélkül.
Főbb pontok
Active Compilation Conditions olyan fordítási jelzők, amelyek meghatározzák az aktív előfeldolgozó direktívák készletét a build fázisban. A futásidejű jelzőktől (if (isDebug) ellenőrzés) eltérően a fordítási feltételek fizikailag kizárják az inaktív kódot a bináris fájlból, ami javítja a teljesítményt és csökkenti az alkalmazás méretét.
A mechanizmus az előfeldolgozó vagy a fordítás korai fázisainak szintjén működik: a fordító kap egy listát az aktív nevekről, és amikor találkozik a #if NAME direktívával, ellenőrzi, hogy a NAME szerepel-e ezen a listán. Ha a név nem létezik — a blokk belsejében lévő kód figyelmen kívül marad és nem fordul.
A Swift.org Blog (2025) szerint az Active Compilation Conditions használata a futásidejű jelzők helyett átlagosan 12-18%-kal csökkenti a release bináris méretét a fejlett naplózási rendszerrel és hibakereső eszközökkel rendelkező projektekben. Ez különösen kritikus a mobilos alkalmazásoknál, ahol korlátozott a telepítőfájl mérete.
A fő különbség a C/C++ előfeldolgozó szintű feltételes fordításhoz képest — az Active Compilation Conditions Swiftben és Kotlinban a fordító AST (Abstract Syntax Tree) szintjén működik, nem a szöveges helyettesítés szintjén. Ez biztonságosabbá és kiszámíthatóbbá teszi őket: bármely szintaktikai hiba az inaktív #if ágban a feldolgozási fázisban észlelésre kerül, nem futásidőben jelenik meg.
Egy másik fontos különbség — Swiftben a #if os(iOS) || os(macOS) feltétel a fordítási fázisban ellenőrzésre kerül, és platformnevekkel működik, nem előfeldolgozó makrókkal. Ez kiküszöböli a #define-on keresztüli helytelen szövegbeillesztéssel kapcsolatos hibák egész osztályát, amelyek a C/C++ előfeldolgozóban lehetségesek. A Swift fordító a helyettesített szöveg helyett az AST-t látja, ami jelentősen megkönnyíti a feltételes fordítás hibakeresését.
A Swift az Active Compilation Conditions-t a #if direktíván keresztül támogatja, amely &&, || és ! logikai operátorokkal összekapcsolt jelzőnevek listáját fogadja el. A fordító a #if ... #endif belsejében lévő kódot csak akkor veszi be, ha a feltétel igaz.
A Swift számos beépített feltételt kínál: DEBUG (automatikusan aktív debug buildben), swift(>=5.0) (fordító verziójának ellenőrzése), canImport(UIKit) (modul elérhetőségének ellenőrzése) és targetEnvironment(simulator) (környezet ellenőrzése). Ezek a feltételek nem igényelnek külön konfigurációt.
// Beépített Swift feltételek
#if DEBUG
print("Debug build — naplózás aktív")
#endif
#if canImport(UIKit)
import UIKit
let screen = UIScreen.main.bounds
#elseif canImport(AppKit)
import AppKit
let screen = NSScreen.main?.frame
#endif
A fejlesztő saját jelzőket adhat hozzá a OTHER_SWIFT_FLAGS Build Setting-en keresztül Xcode-ban. A jelzőt a -D előtaggal kell megadni, például -DBETA vagy -DANALYTICS_ENABLED. Különböző konfigurációkhoz (Debug, Release, Staging) különböző jelzőkészletek állíthatók be.
// Egyedi BETA jelző kezelése
#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
}
A Swift támogatja a platformfeltételeket: os(iOS), os(macOS), os(tvOS), os(watchOS), os(Linux), os(Windows). Ezek a feltételek ellenőrzik a build célplatformját, és lehetővé teszik közös kód írását több Apple platformhoz platformspecifikus blokkokkal.
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
}
Az Android ökoszisztémában az Active Compilation Conditions a BuildConfig rendszeren, productFlavors-on és a build.gradle.kts-ben lévő jelzőkön keresztül valósul meg. A Kotlinnak nincs közvetlen analógja a #if direktívának nyelvi szinten, de alternatív mechanizmusokat kínál.
A leggyakoribb módszer — buildConfigField hozzáadása minden jelzőhöz: buildConfigField("boolean", "BETA", "true"). Ezek a mezők a BuildConfig osztályban minden Build Variant esetében külön generálódnak. A DEBUG mező már beépített, és debug buildeknél automatikusan true.
// build.gradle.kts
android {
buildTypes {
debug {
buildConfigField("boolean", "BETA", "true")
}
release {
buildConfigField("boolean", "BETA", "false")
}
}
}
// Használat Kotlin kódban
if (BuildConfig.BETA) {
enableBetaFeatures()
}
A Gradle lehetővé teszi külön sourceSets könyvtárak létrehozását minden flavor számára. Például src/demo/ és src/full/. Az azonos nevű osztályok a különböző sourceSets-ben helyettesítik egymást a megfelelő flavor buildelésekor. Ez erősebb mechanizmus, mint a jelzők, mert teljes osztályok felülírhatók.
// 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
}
A Kotlin Multiplatform (KMP) esetében elérhető az expect/actual direktíva, amely lehetővé teszi várt deklarációk deklarálását a közös kódban és platformimplementációk biztosítását. Ez egy fordítási szintű mechanizmus, amely hatásában hasonló az Active Compilation Conditions-hoz — az inaktív kód nem fordul le a nem megfelelő platformokra.
Az Active Compilation Conditions négy fő forgatókönyvben használatos: hibakeresés (naplók, ellenőrzők), A/B tesztelés (funkciójelzők), platformadaptáció (iOS/macOS közös kód) és licencelés (ingyenes/fizetős verziók).
A leggyakoribb forgatókönyv — feltételes naplózás. Debug buildben minden napló a konzolra kerül, release-ben — semmi. A #if DEBUG vagy BuildConfig.DEBUG használata garantálja, hogy a release bináris nem tartalmaz semmilyen logger hívást, még inline-okat sem.
func logRequest(_ url: URL, _ statusCode: Int) {
#if DEBUG
Logger.debug("Request to \(url.absoluteString) returned \(statusCode)")
#endif
}
Ha egy új funkcionalitás még nem áll készen az éles használatra, de már létezik a kódban, elrejthető egy fordítási jelző mögé. Ellentétben a futásidejű feature flag-ekkel, a fordítási jelzők nem terhelik az alkalmazást ellenőrzésekkel, és a felhasználó nem kapcsolhatja be őket.
Az Active Compilation Conditions-t mértékkel kell használni. A túl sok jelző megnehezíti a kód megértését: a fejlesztő nem lehet biztos abban, hogy mely ágak fordulnak az adott pillanatban. Javasolt minden jelzőt dokumentálni a README-ben vagy egy külön CONFIG.md fájlban.
Nagy, elosztott csapattal rendelkező projektekben hasznos automatikus jelzőellenőrzést bevezetni a CI-ban. Minden pull request-nek át kell mennie builden az Active Compilation Conditions összes lehetséges kombinációjával. Ez garantálja, hogy az inaktív jelző alatti kód nem tört el a refaktorálás miatt, és egyetlen feltételes fordítási ág sem marad ellenőrizetlen a kiadásig. Az olyan eszközök, mint az xcresulttool (iOS-hez) és a Gradle Build Scan (Androidhoz) segítenek automatizálni ezt a folyamatot.
Gyakran Ismételt Kérdések
#if DEBUG — egy fordítási direktíva: ha a DEBUG nem aktív, a blokk belsejében lévő kód nem kerül a binárisba. if (isDebug) — futásidejű ellenőrzés: a kód mindig lefordul, a feltétel végrehajtás közben ellenőrződik. A #if nem hagy nyomot a release buildben.
A projekt Build Settings-ében keresse meg a Other Swift Flags (OTHER_SWIFT_FLAGS) beállítást, és adjon hozzá egy új sort a jelzővel: -DMY_FLAG. A jelző látható lesz a #if MY_FLAG direktíva számára. Különböző jelzőket állíthat be a Debug és Release konfigurációkhoz.
A Kotlin/JVM-ben nincs közvetlen megfelelő. Helyette BuildConfig mezőket használnak (futásidejű ellenőrzés, de a ProGuard eltávolíthatja a nem használt kódot). Kotlin Multiplatformban — az expect/actual direktíva deklarációs szinten.
Igen, a Swift támogatja a logikai operátorokat: #if DEBUG && BETA, #if os(iOS) || os(tvOS), #if !RELEASE. A feltételek zárójelekkel csoportosíthatók összetett logika esetén. Az AND és OR a szabványos rövidzár-szabályok szerint működik.
A SwiftUI előnézet egy külön folyamatban épül, a fő targettól eltérő jelzőkkel. Lehet, hogy a DEBUG nem aktív. Megoldás: használja a targetEnvironment(simulator) lehetőséget az előnézeti kódhoz, vagy helyezze át a feltételes logikát külön metódusokba.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is