Uygulama Geliştirmede Active Compilation Conditions: Temel Kavramlar ve Uygulama

Yazar: IT Sectr Yayınlanma: 2026-06-01 Okuma süresi: 8 dk

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 — nihai ikili dosyaya hangi kod bloklarının derleneceğini belirleyen özel derleme bayrakları.
  • Swift, Xcode Derleme Ayarları'nda -D önekiyle bayrakları ayarlamak için OTHER_SWIFT_FLAGS anahtarını kullanır.
  • #if yönergesi bir bayrağın varlığını kontrol eder: #if DEBUG içindeki kod yalnızca hata ayıklama derlemesinde derlenir.
  • Android benzer bir yeteneğe sahiptir — Gradle'da BuildConfig alanları ve productFlavors.
  • Performans — koşullu derleme, çalışma zamanı bayraklarının aksine, sürüm ikili dosyasında hiçbir iz bırakmaz.

Active Compilation Conditions Nedir

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'te Active Compilation Conditions

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'te Yerleşik Koşullar

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
// 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

Xcode'da Özel Bayraklar

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.

swift
// Ö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
}

Platform Koşulları #if os()

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.

swift
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 ve Kotlin'de Alternatifler

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.

BuildConfig Alanları Bayrak Olarak

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.

kotlin
// build.gradle.kts
android {
    buildTypes {
        debug {
            buildConfigField("boolean", "BETA", "true")
        }
        release {
            buildConfigField("boolean", "BETA", "false")
        }
    }
}

// Kotlin kodunda kullanım
if (BuildConfig.BETA) {
    enableBetaFeatures()
}

Source Sets ve productFlavors

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.

kotlin
// 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.

Kullanım Durumları ve En İyi Uygulamalar

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).

Hata Ayıklama Günlüğü

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.

swift
func logRequest(_ url: URL, _ statusCode: Int) {
    #if DEBUG
        Logger.debug("Request to \(url.absoluteString) returned \(statusCode)")
    #endif
}

Derleme Zamanında Özellik Bayrakları

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.

  • Yeni özellikler — kodu silmeden bir sonraki sürüme kadar tamamlanmamış işlevselliği gizleyin
  • Analitik — yalnızca beta test kullanıcıları için ek metrik toplamayı etkinleştirin
  • Üçüncü taraf SDK'lar — uygulamanın ücretsiz sürümünden ağır kütüphaneleri hariç tutun
  • UI bileşenleri — yalnızca test derlemelerinde deneysel ekranları gösterin

En İyi Uygulamalar

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.

  • Minimum bayrak — proje başına en fazla 5-7 aktif koşul. Her bayrak bir karmaşıklık noktasıdır.
  • Adlandırma kuralı — tüm bayraklar BÜYÜK HARFLE, proje önekiyle: MYAPP_BETA, MYAPP_ANALYTICS.
  • Kod incelemesi — her #if veya buildConfigField eklemesi ayrı bir incelemeden geçmelidir.
  • Test — CI, günde en az bir kez tüm olası bayrak kombinasyonlarını derlemelidir.

Sıkça Sorulan Sorular

Swift'te #if DEBUG ve if (isDebug) arasındaki fark nedir?

#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.

Xcode'da özel bir bayrağı nasıl eklerim?

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'de Swift #if'in bir eşdeğeri var mı?

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.

Tek bir #if'te birden çok bayrak birleştirilebilir mi?

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 önizlemelerinde #if DEBUG neden çalışmıyor?

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

  • Active Compilation Conditions — çalışma zamanı kontrolleri olmadan ikili dosyadan etkin olmayan kodu fiziksel olarak hariç tutan derleme bayrakları.
  • Swift, yerleşik koşullarla (DEBUG, os, canImport) ve OTHER_SWIFT_FLAGS aracılığıyla özel bayraklarla #if'i destekler.
  • Android ve Kotlin, BuildConfig alanları, productFlavors ve KMP'de expect/actual mekanizmasını kullanır.
  • Performans — koşullu derleme, kapsamlı günlük kaydı olan projelerde ikili dosya boyutunu %12-18 oranında azaltır.
  • Özellik bayrakları derleme zamanında uygulamayı kontrollerle yüklemez ve kullanıcı tarafından etkinleştirilemez.
  • Öneriler — proje başına en fazla 5-7 bayrak, önekli adlandırma kuralı, CI'da tüm kombinasyonların zorunlu testi.

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.

Projeyi tartış

Ayrıca okuyun