Active Compilation Conditions, derleme aşamasında derleyiciye iletilen ve nihai ikili dosyadan belirli kod bloklarının dahil edilmesine veya çıkarılmasına izin veren bayraklardır. Apple Developer Dokümantasyonu (2026)'na göre, Swift, OTHER_SWIFT_FLAGS anahtarı ve #if yönergesi aracılığıyla Active Compilation Conditions'ı destekler. Active Compilation Conditions, geliştiricilere çalışma zamanı kontrolleri olmadan hata ayıklama, test ve üretim için farklı kod sürümleri oluşturma yeteneği verir.
Anahtar Noktalar
Active Compilation Conditions, derleme zamanında aktif ön işlemci yönergeleri kümesini belirleyen derleme bayraklarıdır. Çalışma zamanı bayraklarının (if (isDebug) kontrolü) aksine, derleme koşulları etkin olmayan kodu ikili dosyadan fiziksel olarak hariç tutar, bu da performans kazancı ve uygulama boyutunda azalma sağlar.
Mekanizma ön işlemci veya erken derleme aşamaları seviyesinde çalışır: derleyici aktif adların bir listesini alır ve #if NAME yönergesiyle karşılaştığında, NAME'in bu listede olup olmadığını kontrol eder. Ad mevcut değilse, blok içindeki kod yok sayılır ve derlenmez.
Swift.org Blogu'na (2025) göre, çalışma zamanı bayrakları yerine Active Compilation Conditions kullanmak, kapsamlı günlük kaydı ve hata ayıklama araçlarına sahip projeler için sürüm ikili dosyası boyutunu ortalama %12-18 oranında azaltır. Bu, kurulum dosyası boyutu sınırlamaları olan mobil uygulamalar için özellikle kritiktir.
C/C++ ön işlemci seviyesinde koşullu derlemeden temel fark, Swift ve Kotlin'deki Active Compilation Conditions'ın metin değiştirme seviyesinde değil, derleyicinin AST (Soyut Sözdizimi Ağacı) seviyesinde çalışmasıdır. Bu, onları daha güvenli ve öngörülebilir kılar: etkin olmayan bir #if dalındaki herhangi bir sözdizimi hatası, ayrıştırma aşamasında tespit edilecek, çalışma zamanında ortaya çıkmayacaktır.
Bir diğer önemli fark, Swift'te #if os(iOS) || os(macOS) koşulunun derleme zamanında kontrol edilmesi ve ön işlemci makroları yerine platform adlarıyla çalışmasıdır. Bu, C/C++ ön işlemcisinde mümkün olan #define aracılığıyla yanlış metin eklemeyle ilgili tüm bir hata sınıfını ortadan kaldırır. Swift derleyicisi, değiştirilmiş metni değil AST'yi görür, bu da koşullu derlemenin hata ayıklamasını önemli ölçüde kolaylaştırır.
Swift, mantıksal operatörler &&, || ve ! ile birleştirilmiş bayrak adları listesini kabul eden #if yönergesi aracılığıyla Active Compilation Conditions'ı destekler. Derleyici, #if ... #endif içindeki kodu yalnızca koşul doğruysa dahil eder.
Swift birkaç yerleşik koşul sağlar: DEBUG (hata ayıklama derlemelerinde otomatik olarak aktif), swift(>=5.0) (derleyici sürümü kontrolü), canImport(UIKit) (modül kullanılabilirliği kontrolü) ve targetEnvironment(simulator) (ortam kontrolü). Bu koşullar ek yapılandırma gerektirmez.
// Swift'te yerleşik koşullar
#if DEBUG
print("Hata ayıklama derlemesi — günlük kaydı aktif")
#endif
#if canImport(UIKit)
import UIKit
let screen = UIScreen.main.bounds
#elseif canImport(AppKit)
import AppKit
let screen = NSScreen.main?.frame
#endif
Geliştiriciler, Xcode'da Derleme Ayarı OTHER_SWIFT_FLAGS aracılığıyla kendi bayraklarını ekleyebilirler. Bayrak, -D önekiyle belirtilir, örneğin -DBETA veya -DANALYTICS_ENABLED. Farklı yapılandırmalar (Debug, Release, Staging) için farklı bayrak kümeleri ayarlanabilir.
// Özel BETA bayrağının işlenmesi
#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 platform koşullarını destekler: os(iOS), os(macOS), os(tvOS), os(watchOS), os(Linux), os(Windows). Bu koşullar hedef derleme platformunu kontrol eder ve platforma özel bloklarla birden çok Apple platformu arasında paylaşılan kod yazmaya olanak tanır.
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 ekosisteminde, Active Compilation Conditions BuildConfig sistemi, productFlavors ve build.gradle.kts'deki bayraklar aracılığıyla uygulanır. Kotlin, dil seviyesinde #if yönergesinin doğrudan bir eşdeğerine sahip değildir ancak alternatif mekanizmalar sağlar.
En yaygın yaklaşım, her bayrak için bir buildConfigField eklemektir: buildConfigField("boolean", "BETA", "true"). Bu alanlar, her Derleme Varyantı için ayrı ayrı BuildConfig sınıfında oluşturulur. DEBUG alanı zaten yerleşiktir ve hata ayıklama derlemeleri için otomatik olarak true'dur.
// build.gradle.kts
android {
buildTypes {
debug {
buildConfigField("boolean", "BETA", "true")
}
release {
buildConfigField("boolean", "BETA", "false")
}
}
}
// Kotlin kodunda kullanım
if (BuildConfig.BETA) {
enableBetaFeatures()
}
Gradle, her çeşni için ayrı sourceSets dizinleri oluşturulmasına izin verir. Örneğin, src/demo/ ve src/full/. Farklı sourceSets'lerde aynı ada sahip sınıflar, ilgili çeşni derlenirken birbirlerinin yerini alır. Bu, bayraklardan daha güçlü bir mekanizmadır çünkü tüm sınıflar geçersiz kılınabilir.
// 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) için, ortak kodda beklenen bildirimleri bildirmeye ve platforma özel uygulamalar sağlamaya olanak tanıyan expect/actual yönergesi mevcuttur. Bu, etki bakımından Active Compilation Conditions'a benzer bir derleyici seviyesi mekanizmasıdır — uygun olmayan platformlar için etkin olmayan kod derlenmez.
Active Compilation Conditions dört ana senaryoda kullanılır: hata ayıklama (günlükler, denetleyiciler), A/B testi (özellik bayrakları), platform uyarlaması (iOS/macOS paylaşılan kod) ve lisanslama (ücretsiz/ücretli sürümler).
En yaygın senaryo, koşullu günlük kaydıdır. Hata ayıklama derlemelerinde, tüm günlükler konsola yazılır; sürüm derlemelerinde hiçbir şey kaydedilmez. #if DEBUG veya BuildConfig.DEBUG kullanmak, sürüm ikili dosyasının, satır içine alınmış olanlar dahil, tek bir günlük çağrısı içermemesini sağlar.
func logRequest(_ url: URL, _ statusCode: Int) {
#if DEBUG
Logger.debug("Request to \(url.absoluteString) returned \(statusCode)")
#endif
}
Yeni bir özellik henüz üretim için hazır değilse ancak kodda zaten mevcutsa, bir derleme bayrağının arkasına gizlenebilir. Çalışma zamanı özellik bayraklarının aksine, derleme bayrakları uygulamayı kontrollerle yüklemez ve kullanıcı tarafından etkinleştirilemez.
Active Compilation Conditions ölçülü kullanılmalıdır. Aşırı sayıda bayrak, kodu anlaşılması zor hale getirir: geliştirici, belirli bir anda hangi dalların derleneceğinden emin olamaz. Her bayrağın README'de veya özel bir CONFIG.md dosyasında belgelenmesi önerilir.
Dağıtık ekiplere sahip büyük projelerde, CI'da otomatik bayrak doğrulaması uygulamak faydalıdır. Her çekme isteği, Active Compilation Conditions'ın tüm olası kombinasyonlarıyla derlemeyi geçmelidir. Bu, etkin olmayan bir bayrak altındaki kodun yeniden düzenleme nedeniyle bozulmadığını ve sürüme kadar hiçbir koşullu derleme dalının test edilmemiş kalmadığını garanti eder. xcresulttool (iOS için) ve Gradle Build Scan (Android için) gibi araçlar bu süreci otomatikleştirmeye yardımcı olur.
Sıkça Sorulan Sorular
#if DEBUG bir derleme yönergesidir: DEBUG etkin değilse, blok içindeki kod ikili dosyaya girmez. if (isDebug) bir çalışma zamanı kontrolüdür: kod her zaman derlenir, koşul çalışma zamanında kontrol edilir. #if, sürüm derlemesinde hiçbir iz bırakmaz.
Projenin Derleme Ayarları'nda Other Swift Flags (OTHER_SWIFT_FLAGS) seçeneğini bulun ve bayrakla birlikte yeni bir satır ekleyin: -DMY_FLAG. Bayrak, #if MY_FLAG yönergesi tarafından görülebilir olacaktır. Debug ve Release yapılandırmaları için farklı bayraklar ayarlanabilir.
Kotlin/JVM'de doğrudan bir eşdeğer yoktur. Bunun yerine, BuildConfig alanları kullanılır (çalışma zamanı kontrolü, ancak ProGuard kullanılmayan kodu kaldırabilir). Kotlin Multiplatform'da — bildirim seviyesinde expect/actual yönergesi.
Evet, Swift mantıksal operatörleri destekler: #if DEBUG && BETA, #if os(iOS) || os(tvOS), #if !RELEASE. Koşullar, karmaşık mantık için parantezlerle gruplandırılabilir. AND ve OR, standart kısa devre kurallarına göre çalışır.
SwiftUI önizlemeleri, ana hedeften farklı bayraklarla ayrı bir süreçte derlenir. DEBUG etkin olmayabilir. Çözüm: önizleme kodu için targetEnvironment(simulator) kullanın veya koşullu mantığı ayrı yöntemlere çıkarın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun