Ang Active Compilation Conditions ay mga flag na ipinapasa sa compiler sa yugto ng build at nagbibigay-daan na isama o ibukod ang mga partikular na bloke ng code mula sa final binary file. Ayon sa Apple Developer Documentation (2026), sinusuportahan ng Swift ang Active Compilation Conditions sa pamamagitan ng key na OTHER_SWIFT_FLAGS at direktibang #if. Active Compilation Conditions ay nagbibigay sa mga developer ng kakayahang bumuo ng iba't ibang bersyon ng code para sa debugging, pagsubok at produksyon nang walang runtime checks.
Mga Pangunahing Punto
Active Compilation Conditions ay mga flag ng compilation na nagtatakda ng set ng mga aktibong preprocessor directive sa yugto ng build. Hindi tulad ng runtime flags (check na if (isDebug)), ang mga kondisyon ng compilation ay pisikal na nagbubukod ng hindi aktibong code mula sa binary file, na nagpapabuti sa pagganap at nagpapababa ng laki ng app.
Ang mekanismo ay gumagana sa antas ng preprocessor o mga maagang yugto ng compilation: ang compiler ay tumatanggap ng listahan ng mga aktibong pangalan at kapag nakatagpo ng direktibang #if NAME sinusuri nito kung ang NAME ay nasa listahang ito. Kung wala ang pangalan — ang code sa loob ng bloke ay hindi pinapansin at hindi compile.
Ayon sa Swift.org Blog (2025), ang paggamit ng Active Compilation Conditions sa halip na runtime flags ay nagpapababa ng laki ng release binary nang average na 12-18% para sa mga proyektong may advanced na logging system at debugging tools. Ito ay lalong mahalaga para sa mga mobile app na may limitasyon sa laki ng installation file.
Ang pangunahing pagkakaiba mula sa conditional compilation sa antas ng C/C++ preprocessor — ang Active Compilation Conditions sa Swift at Kotlin ay gumagana sa antas ng AST (Abstract Syntax Tree) ng compiler, hindi sa antas ng text replacement. Ginagawa nitong mas ligtas at mas predictable ang mga ito: anumang syntax error sa hindi aktibong sangay ng #if ay matutukoy sa yugto ng parsing, hindi lilitaw sa runtime.
Isa pang mahalagang pagkakaiba — sa Swift ang kondisyong #if os(iOS) || os(macOS) ay sinusuri sa yugto ng compilation at gumagana sa mga pangalan ng platform, hindi sa preprocessor macros. Inaalis nito ang isang buong klase ng mga bug na may kaugnayan sa maling pagpapasok ng text sa pamamagitan ng #define, na posible sa C/C++ preprocessor. Ang Swift compiler ay nakakakita ng AST, hindi ang pinalitang text, na ginagawang mas madali ang pag-debug ng conditional compilation.
Sinusuportahan ng Swift ang Active Compilation Conditions sa pamamagitan ng direktibang #if, na tumatanggap ng listahan ng mga pangalan ng flag na pinagsama ng mga lohikal na operator na &&, || at !. Isinasama ng compiler ang code sa loob ng #if ... #endif kung totoo lamang ang kondisyon.
Nagbibigay ang Swift ng ilang built-in na kondisyon: DEBUG (awtomatikong aktibo sa debug build), swift(>=5.0) (pagsusuri ng bersyon ng compiler), canImport(UIKit) (pagsusuri ng availability ng module) at targetEnvironment(simulator) (pagsusuri ng kapaligiran). Ang mga kondisyong ito ay hindi nangangailangan ng karagdagang configuration.
// Mga built-in na kondisyon ng Swift
#if DEBUG
print("Debug build — aktibo ang pag-log")
#endif
#if canImport(UIKit)
import UIKit
let screen = UIScreen.main.bounds
#elseif canImport(AppKit)
import AppKit
let screen = NSScreen.main?.frame
#endif
Ang developer ay maaaring magdagdag ng sariling mga flag sa pamamagitan ng Build Setting na OTHER_SWIFT_FLAGS sa Xcode. Ang flag ay tinutukoy na may prefix na -D, halimbawa -DBETA o -DANALYTICS_ENABLED. Para sa iba't ibang configuration (Debug, Release, Staging) ay maaaring magtakda ng iba't ibang set ng mga flag.
// Paghawak ng custom na flag na BETA
#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
}
Sinusuportahan ng Swift ang mga kondisyon ng platform: os(iOS), os(macOS), os(tvOS), os(watchOS), os(Linux), os(Windows). Sinusuri ng mga kondisyong ito ang target platform ng build at nagbibigay-daan sa pagsulat ng code na karaniwan para sa maraming Apple platform na may mga bloke na tiyak sa platform.
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
}
Sa Android ecosystem, ang Active Compilation Conditions ay ipinatutupad sa pamamagitan ng sistemang BuildConfig, productFlavors at mga flag sa build.gradle.kts. Ang Kotlin ay walang direktang analog ng direktibang #if sa antas ng wika, ngunit nagbibigay ng mga alternatibong mekanismo.
Ang pinakakaraniwang paraan — magdagdag ng buildConfigField para sa bawat flag: buildConfigField("boolean", "BETA", "true"). Ang mga field na ito ay nabubuo sa klase ng BuildConfig para sa bawat Build Variant nang hiwalay. Ang field na DEBUG ay built-in na at awtomatikong true para sa mga debug build.
// build.gradle.kts
android {
buildTypes {
debug {
buildConfigField("boolean", "BETA", "true")
}
release {
buildConfigField("boolean", "BETA", "false")
}
}
}
// Paggamit sa Kotlin code
if (BuildConfig.BETA) {
enableBetaFeatures()
}
Pinapayagan ng Gradle ang paglikha ng hiwalay na sourceSets directory para sa bawat flavor. Halimbawa, src/demo/ at src/full/. Ang mga klase na may parehong pangalan sa iba't ibang sourceSets ay nagpapalitan sa isa't isa kapag binuo ang kaukulang flavor. Ito ay mas malakas na mekanismo kaysa sa mga flag, dahil ang buong klase ay maaaring i-override.
// 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
}
Para sa Kotlin Multiplatform (KMP) ay available ang direktibang expect/actual, na nagbibigay-daan sa pagdeklara ng inaasahang deklarasyon sa common code at pagbibigay ng mga platform implementation. Ito ay mekanismo sa antas ng compilation, katulad ng epekto ng Active Compilation Conditions — ang hindi aktibong code ay hindi compile para sa hindi angkop na mga platform.
Ang Active Compilation Conditions ay ginagamit sa apat na pangunahing sitwasyon: debugging (mga log, inspektor), A/B testing (mga flag ng feature), pag-aangkop sa platform (iOS/macOS common code) at paglilisensya (libre/binabayarang bersyon).
Ang pinakakaraniwang sitwasyon — conditional logging. Sa debug build lahat ng log ay isinusulat sa console, sa release — wala. Ang paggamit ng #if DEBUG o BuildConfig.DEBUG ay ginagarantiyahan na ang release binary ay walang anumang tawag sa logger, kahit na inline.
func logRequest(_ url: URL, _ statusCode: Int) {
#if DEBUG
Logger.debug("Request to \(url.absoluteString) returned \(statusCode)")
#endif
}
Kung ang bagong functionality ay hindi pa handa para sa produksyon ngunit nasa code na, maaari itong itago sa likod ng isang compilation flag. Hindi tulad ng runtime feature flags, ang compilation flags ay hindi nagpapabigat sa app ng mga pagsusuri at hindi maaaring i-activate ng user.
Ang Active Compilation Conditions ay dapat gamitin nang katamtaman. Ang sobrang dami ng flag ay nagpapahirap sa pag-unawa ng code: hindi makasigurado ang developer kung aling mga sangay ang compile sa kasalukuyan. Inirerekomenda na idokumento ang bawat flag sa README o espesyal na file na CONFIG.md.
Sa malalaking proyekto na may distributed team, kapaki-pakinabang na magpatupad ng awtomatikong validation ng flag sa CI. Ang bawat pull request ay dapat dumaan sa build na may lahat ng posibleng kombinasyon ng Active Compilation Conditions. Ginagarantiyahan nito na ang code sa ilalim ng hindi aktibong flag ay hindi nasira dahil sa refactoring at walang sangay ng conditional compilation ang nanatiling hindi nasuri hanggang sa pag-release. Ang mga tool tulad ng xcresulttool (para sa iOS) at Gradle Build Scan (para sa Android) ay tumutulong sa pag-automate ng prosesong ito.
Mga Madalas Itanong
#if DEBUG — ay isang direktiba ng compilation: kung hindi aktibo ang DEBUG, ang code sa loob ng bloke ay hindi pumapasok sa binary. if (isDebug) — runtime check: ang code ay laging compile, ang kondisyon ay sinusuri habang isinasagawa. Ang #if ay hindi nag-iiwan ng bakas sa release build.
Sa Build Settings ng proyekto, hanapin ang Other Swift Flags (OTHER_SWIFT_FLAGS) at magdagdag ng bagong linya na may flag: -DMY_FLAG. Ang flag ay makikita ng direktibang #if MY_FLAG. Maaari kang magtakda ng iba't ibang flag para sa Debug at Release configuration.
Sa Kotlin/JVM walang direktang katumbas. Sa halip ay ginagamit ang mga field ng BuildConfig (runtime check, ngunit maaaring alisin ng ProGuard ang hindi nagamit na code). Sa Kotlin Multiplatform — direktibang expect/actual sa antas ng deklarasyon.
Oo, sinusuportahan ng Swift ang mga lohikal na operator: #if DEBUG && BETA, #if os(iOS) || os(tvOS), #if !RELEASE. Ang mga kondisyon ay maaaring igrupo gamit ang mga panaklong para sa kumplikadong lohika. Ang AND at OR ay gumagana ayon sa karaniwang mga patakaran ng short-circuit.
Ang SwiftUI preview ay binuo sa isang hiwalay na proseso na may mga flag na iba sa pangunahing target. Maaaring hindi aktibo ang DEBUG. Solusyon: gamitin ang targetEnvironment(simulator) para sa preview code o ilipat ang conditional logic sa hiwalay na mga pamamaraan.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din