Active Compilation Conditions adalah flag yang diteruskan ke compiler pada tahap build dan memungkinkan untuk menyertakan atau mengecualikan blok kode tertentu dari file biner final. Menurut Apple Developer Documentation (2026), Swift mendukung Active Compilation Conditions melalui kunci OTHER_SWIFT_FLAGS dan direktif #if. Active Compilation Conditions memberikan pengembang kemampuan untuk membangun versi kode yang berbeda untuk debugging, pengujian, dan produksi tanpa pemeriksaan runtime.
Poin Utama
Active Compilation Conditions adalah flag kompilasi yang menentukan kumpulan direktif preprocessor aktif pada tahap build. Tidak seperti flag runtime (pemeriksaan if (isDebug)), kondisi kompilasi secara fisik mengecualikan kode yang tidak aktif dari file biner, yang meningkatkan kinerja dan mengurangi ukuran aplikasi.
Mekanismenya bekerja pada tingkat preprocessor atau fase awal kompilasi: compiler menerima daftar nama aktif dan ketika menemui direktif #if NAME memeriksa apakah NAME ada dalam daftar ini. Jika nama tidak ada — kode di dalam blok diabaikan dan tidak dikompilasi.
Menurut Swift.org Blog (2025), penggunaan Active Compilation Conditions sebagai pengganti flag runtime mengurangi ukuran biner release rata-rata sebesar 12-18% untuk proyek dengan sistem logging dan alat debugging yang canggih. Ini sangat penting untuk aplikasi seluler dengan batasan ukuran file instalasi.
Perbedaan utama dari kompilasi bersyarat pada tingkat preprocessor C/C++ — Active Compilation Conditions di Swift dan Kotlin bekerja pada tingkat AST (Abstract Syntax Tree) compiler, bukan pada tingkat penggantian teks. Ini membuatnya lebih aman dan lebih dapat diprediksi: kesalahan sintaks apa pun di cabang #if yang tidak aktif akan terdeteksi pada fase parsing, tidak akan muncul di runtime.
Perbedaan penting lainnya — di Swift kondisi #if os(iOS) || os(macOS) diperiksa pada fase kompilasi dan bekerja dengan nama platform, bukan dengan makro preprocessor. Ini menghilangkan seluruh kelas bug yang terkait dengan penyisipan teks yang salah melalui #define, yang mungkin terjadi di preprocessor C/C++. Compiler Swift melihat AST, bukan teks yang diganti, yang membuat debugging kompilasi bersyarat jauh lebih mudah.
Swift mendukung Active Compilation Conditions melalui direktif #if, yang menerima daftar nama flag yang digabungkan dengan operator logika &&, || dan !. Compiler menyertakan kode di dalam #if ... #endif hanya jika kondisinya benar.
Swift menyediakan beberapa kondisi bawaan: DEBUG (aktif secara otomatis di build debug), swift(>=5.0) (pemeriksaan versi compiler), canImport(UIKit) (pemeriksaan ketersediaan modul) dan targetEnvironment(simulator) (pemeriksaan lingkungan). Kondisi ini tidak memerlukan konfigurasi tambahan.
// Kondisi bawaan Swift
#if DEBUG
print("Build debug — logging aktif")
#endif
#if canImport(UIKit)
import UIKit
let screen = UIScreen.main.bounds
#elseif canImport(AppKit)
import AppKit
let screen = NSScreen.main?.frame
#endif
Pengembang dapat menambahkan flag sendiri melalui Build Setting OTHER_SWIFT_FLAGS di Xcode. Flag ditentukan dengan prefiks -D, misalnya -DBETA atau -DANALYTICS_ENABLED. Untuk konfigurasi yang berbeda (Debug, Release, Staging) dapat diatur kumpulan flag yang berbeda.
// Penanganan flag kustom 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
}
Swift mendukung kondisi platform: os(iOS), os(macOS), os(tvOS), os(watchOS), os(Linux), os(Windows). Kondisi ini memeriksa platform target build dan memungkinkan penulisan kode yang umum untuk beberapa platform Apple dengan blok khusus 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
}
Di ekosistem Android, Active Compilation Conditions diimplementasikan melalui sistem BuildConfig, productFlavors dan flag di build.gradle.kts. Kotlin tidak memiliki analog langsung dari direktif #if di tingkat bahasa, tetapi menyediakan mekanisme alternatif.
Cara paling umum — menambahkan buildConfigField untuk setiap flag: buildConfigField("boolean", "BETA", "true"). Bidang-bidang ini dihasilkan di kelas BuildConfig untuk setiap Build Variant secara terpisah. Bidang DEBUG sudah ada dan secara otomatis true untuk build debug.
// build.gradle.kts
android {
buildTypes {
debug {
buildConfigField("boolean", "BETA", "true")
}
release {
buildConfigField("boolean", "BETA", "false")
}
}
}
// Penggunaan dalam kode Kotlin
if (BuildConfig.BETA) {
enableBetaFeatures()
}
Gradle memungkinkan pembuatan direktori sourceSets terpisah untuk setiap flavor. Misalnya, src/demo/ dan src/full/. Kelas dengan nama yang sama di sourceSets yang berbeda saling menggantikan saat membangun flavor yang sesuai. Ini adalah mekanisme yang lebih kuat dari flag, karena seluruh kelas dapat ditimpa.
// 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
}
Untuk Kotlin Multiplatform (KMP) tersedia direktif expect/actual, yang memungkinkan mendeklarasikan deklarasi yang diharapkan dalam kode bersama dan menyediakan implementasi platform. Ini adalah mekanisme tingkat kompilasi yang efeknya mirip dengan Active Compilation Conditions — kode yang tidak aktif tidak dikompilasi untuk platform yang tidak sesuai.
Active Compilation Conditions digunakan dalam empat skenario utama: debugging (log, inspektur), pengujian A/B (flag fitur), adaptasi platform (kode bersama iOS/macOS) dan lisensi (versi gratis/berbayar).
Skenario paling umum — logging bersyarat. Di build debug semua log ditulis ke konsol, di release — tidak ada. Penggunaan #if DEBUG atau BuildConfig.DEBUG menjamin bahwa biner release tidak berisi panggilan logger apa pun, bahkan yang di-inline.
func logRequest(_ url: URL, _ statusCode: Int) {
#if DEBUG
Logger.debug("Request to \(url.absoluteString) returned \(statusCode)")
#endif
}
Jika fungsionalitas baru belum siap untuk produksi tetapi sudah ada di kode, dapat disembunyikan di balik flag kompilasi. Tidak seperti runtime feature flags, flag kompilasi tidak membebani aplikasi dengan pemeriksaan dan tidak dapat diaktifkan oleh pengguna.
Active Compilation Conditions harus digunakan secukupnya. Jumlah flag yang berlebihan membuat kode sulit dipahami: pengembang tidak dapat yakin cabang mana yang akan dikompilasi saat ini. Disarankan untuk mendokumentasikan setiap flag di README atau file CONFIG.md khusus.
Dalam proyek besar dengan tim terdistribusi, berguna untuk menerapkan validasi otomatis flag di CI. Setiap pull request harus melalui build dengan semua kemungkinan kombinasi Active Compilation Conditions. Ini menjamin bahwa kode di bawah flag yang tidak aktif tidak rusak karena refactoring dan tidak ada cabang kompilasi bersyarat yang tidak teruji hingga saat rilis. Alat seperti xcresulttool (untuk iOS) dan Gradle Build Scan (untuk Android) membantu mengotomatiskan proses ini.
Pertanyaan yang Sering Diajukan
#if DEBUG — adalah direktif kompilasi: jika DEBUG tidak aktif, kode di dalam blok tidak masuk ke biner. if (isDebug) — pemeriksaan runtime: kode selalu dikompilasi, kondisi diperiksa selama eksekusi. #if tidak meninggalkan jejak di build release.
Di Build Settings proyek, temukan Other Swift Flags (OTHER_SWIFT_FLAGS) dan tambahkan baris baru dengan flag: -DMY_FLAG. Flag akan terlihat oleh direktif #if MY_FLAG. Anda dapat mengatur flag yang berbeda untuk konfigurasi Debug dan Release.
Di Kotlin/JVM tidak ada padanan langsung. Sebagai gantinya digunakan bidang BuildConfig (pemeriksaan runtime, tetapi ProGuard dapat menghapus kode yang tidak digunakan). Di Kotlin Multiplatform — direktif expect/actual di tingkat deklarasi.
Ya, Swift mendukung operator logika: #if DEBUG && BETA, #if os(iOS) || os(tvOS), #if !RELEASE. Kondisi dapat dikelompokkan dengan tanda kurung untuk logika yang kompleks. AND dan OR bekerja sesuai aturan hubung singkat standar.
Pratinjau SwiftUI dibangun dalam proses terpisah dengan flag yang berbeda dari target utama. DEBUG mungkin tidak aktif. Solusi: gunakan targetEnvironment(simulator) untuk kode pratinjau atau pindahkan logika bersyarat ke metode terpisah.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga