Active Compilation Conditions jsou příznaky předávané překladači ve fázi sestavení, které umožňují zahrnout nebo vyloučit určité bloky kódu z konečného binárního souboru. Podle Apple Developer Documentation (2026) Swift podporuje Active Compilation Conditions prostřednictvím klíče OTHER_SWIFT_FLAGS a direktivy #if. Active Compilation Conditions dávají vývojářům možnost sestavit různé verze kódu pro ladění, testování a produkci bez kontrol za běhu.
Hlavní body
Active Compilation Conditions jsou příznaky překladu, které určují sadu aktivních direktiv preprocesoru ve fázi sestavení. Na rozdíl od runtime příznaků (kontrola if (isDebug)) podmínky překladu fyzicky vylučují neaktivní kód z binárního souboru, což zlepšuje výkon a zmenšuje velikost aplikace.
Mechanismus pracuje na úrovni preprocesoru nebo raných fází překladu: překladač obdrží seznam aktivních jmen a když narazí na direktivu #if NAME, zkontroluje, zda je NAME v tomto seznamu. Pokud jméno neexistuje — kód uvnitř bloku je ignorován a není přeložen.
Podle Swift.org Blog (2025) použití Active Compilation Conditions místo runtime příznaků snižuje velikost release binárního souboru v průměru o 12-18% u projektů s rozvinutým systémem logování a nástroji pro ladění. To je obzvláště důležité pro mobilní aplikace s omezením velikosti instalačního souboru.
Hlavní rozdíl oproti podmíněnému překladu na úrovni preprocesoru C/C++ — Active Compilation Conditions ve Swift a Kotlin pracují na úrovni AST (Abstract Syntax Tree) překladače, nikoli na úrovni textového nahrazování. To je činí bezpečnějšími a předvídatelnějšími: jakákoli syntaktická chyba v neaktivní větvi #if bude odhalena ve fázi parsování, neobjeví se za běhu.
Další důležitý rozdíl — ve Swift je podmínka #if os(iOS) || os(macOS) kontrolována ve fázi překladu a pracuje s názvy platforem, nikoli s makry preprocesoru. To eliminuje celou třídu chyb souvisejících s nesprávným vkládáním textu přes #define, které jsou možné v preprocesoru C/C++. Překladač Swift vidí AST, nikoli nahrazený text, což výrazně usnadňuje ladění podmíněného překladu.
Swift podporuje Active Compilation Conditions prostřednictvím direktivy #if, která přijímá seznam názvů příznaků spojených logickými operátory &&, || a !. Překladač zahrne kód uvnitř #if ... #endif pouze pokud je podmínka pravdivá.
Swift poskytuje několik vestavěných podmínek: DEBUG (automaticky aktivní v debug sestavení), swift(>=5.0) (kontrola verze překladače), canImport(UIKit) (kontrola dostupnosti modulu) a targetEnvironment(simulator) (kontrola prostředí). Tyto podmínky nevyžadují další konfiguraci.
// Vestavěné podmínky Swift
#if DEBUG
print("Debug sestavení — logování aktivní")
#endif
#if canImport(UIKit)
import UIKit
let screen = UIScreen.main.bounds
#elseif canImport(AppKit)
import AppKit
let screen = NSScreen.main?.frame
#endif
Vývojář může přidávat vlastní příznaky prostřednictvím Build Setting OTHER_SWIFT_FLAGS v Xcode. Příznak se uvádí s předponou -D, například -DBETA nebo -DANALYTICS_ENABLED. Pro různé konfigurace (Debug, Release, Staging) lze nastavit různé sady příznaků.
// Zpracování vlastního příznaku 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 podporuje platformní podmínky: os(iOS), os(macOS), os(tvOS), os(watchOS), os(Linux), os(Windows). Tyto podmínky kontrolují cílovou platformu sestavení a umožňují psát společný kód pro více platforem Apple s bloky specifickými pro platformu.
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
}
V ekosystému Android jsou Active Compilation Conditions implementovány prostřednictvím systému BuildConfig, productFlavors a příznaků v build.gradle.kts. Kotlin nemá přímou analogii direktivy #if na úrovni jazyka, ale poskytuje alternativní mechanismy.
Nejčastější způsob — přidat buildConfigField pro každý příznak: buildConfigField("boolean", "BETA", "true"). Tato pole jsou generována ve třídě BuildConfig pro každý Build Variant zvlášť. Pole DEBUG je již vestavěno a automaticky true pro debug sestavení.
// build.gradle.kts
android {
buildTypes {
debug {
buildConfigField("boolean", "BETA", "true")
}
release {
buildConfigField("boolean", "BETA", "false")
}
}
}
// Použití v kódu Kotlin
if (BuildConfig.BETA) {
enableBetaFeatures()
}
Gradle umožňuje vytvářet samostatné adresáře sourceSets pro každý flavor. Například src/demo/ a src/full/. Třídy se stejným názvem v různých sourceSets se navzájem nahrazují při sestavení příslušného flavoru. Jedná se o silnější mechanismus než příznaky, protože lze přepsat celé třídy.
// 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
}
Pro Kotlin Multiplatform (KMP) je k dispozici direktiva expect/actual, která umožňuje deklarovat očekávané deklarace ve společném kódu a poskytovat platformní implementace. Jedná se o mechanismus na úrovni překladu, svým účinkem podobný Active Compilation Conditions — neaktivní kód není překládán pro nevhodné platformy.
Active Compilation Conditions se používají ve čtyřech hlavních scénářích: ladění (logy, inspektory), A/B testování (příznaky funkcí), platformní adaptace (společný kód iOS/macOS) a licencování (bezplatné/placené verze).
Nejčastější scénář — podmíněné logování. V debug sestavení jsou všechny logy zapisovány do konzole, v release — žádné. Použití #if DEBUG nebo BuildConfig.DEBUG zaručuje, že release binární soubor neobsahuje žádné volání loggeru, ani inline.
func logRequest(_ url: URL, _ statusCode: Int) {
#if DEBUG
Logger.debug("Request to \(url.absoluteString) returned \(statusCode)")
#endif
}
Pokud nová funkcionalita ještě není připravena pro produkci, ale již existuje v kódu, lze ji skrýt za příznak překladu. Na rozdíl od runtime feature flags příznaky překladu nezatěžují aplikaci kontrolami a nemohou být uživatelem zapnuty.
Active Compilation Conditions by měly být používány s mírou. Nadměrný počet příznaků činí kód obtížně srozumitelným: vývojář si nemůže být jistý, které větve se v daném okamžiku překládají. Doporučuje se dokumentovat každý příznak v README nebo speciálním souboru CONFIG.md.
Ve velkých projektech s distribuovaným týmem je užitečné implementovat automatickou validaci příznaků v CI. Každý pull request by měl projít sestavením se všemi možnými kombinacemi Active Compilation Conditions. To zaručuje, že se kód pod neaktivním příznakem nerozbil kvůli refaktorování a žádná větev podmíněného překladu nezůstala nezkontrolována až do vydání. Nástroje jako xcresulttool (pro iOS) a Gradle Build Scan (pro Android) pomáhají tento proces automatizovat.
Často kladené otázky
#if DEBUG — je direktiva překladu: pokud DEBUG není aktivní, kód uvnitř bloku se nedostane do binárního souboru. if (isDebug) — kontrola za běhu: kód je vždy přeložen, podmínka se kontroluje během provádění. #if nezanechává stopy v release sestavení.
V Build Settings projektu najděte Other Swift Flags (OTHER_SWIFT_FLAGS) a přidejte nový řádek s příznakem: -DMY_FLAG. Příznak bude viditelný pro direktivu #if MY_FLAG. Můžete nastavit různé příznaky pro konfigurace Debug a Release.
V Kotlin/JVM neexistuje přímá analogie. Místo toho se používají pole BuildConfig (kontrola za běhu, ale ProGuard může odstranit nepoužitý kód). V Kotlin Multiplatform — direktiva expect/actual na úrovni deklarací.
Ano, Swift podporuje logické operátory: #if DEBUG && BETA, #if os(iOS) || os(tvOS), #if !RELEASE. Podmínky lze seskupovat závorkami pro složitou logiku. AND a OR pracují podle standardních pravidel zkratového vyhodnocování.
Náhled SwiftUI se sestavuje v samostatném procesu s příznaky odlišnými od hlavního targetu. DEBUG nemusí být aktivní. Řešení: použijte targetEnvironment(simulator) pro kód náhledu nebo přesuňte podmíněnou logiku do samostatných metod.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také