"Onde está o #ifdef?" — a primeira pergunta de um desenvolvedor C em Swift
\n\nSe você já migrou de C, C++ ou Objective-C para Swift, certamente já se perguntou: "Como faço compilação condicional aqui? Onde está meu amado #ifdef?" Esta é uma das perguntas mais populares no Stack Overflow — e não é à toa. No mundo Swift, não há pré-processador no sentido tradicional, mas isso não significa que você não possa gerenciar flexivelmente a compilação para diferentes plataformas, configurações ou modos de depuração.
\n\nNeste artigo, vamos explorar as melhores formas de substituir o #ifdef em Swift: desde diretivas simples até esquemas de compilação avançados. Você aprenderá a escrever código que funciona tanto no iOS quanto no macOS, como ocultar informações de depuração na versão de produção e como não se confundir com flags de plataforma. Vamos lá!
\n\nPor que o Swift não tem #ifdef (e isso é bom)
\n\nO pré-processador C é uma ferramenta poderosa, mas perigosa. Ele funciona antes do compilador, não conhece tipos ou escopos. Como resultado, é fácil ter um #define que quebra tudo ao redor. Os desenvolvedores do Swift decidiram seguir outro caminho: eles incorporaram a compilação condicional diretamente na linguagem, tornando-a mais segura e transparente.
Em vez de #ifdef, você usa #if, #elseif, #else e #endif — a sintaxe é semelhante, mas funciona no nível do compilador Swift, não do pré-processador. Além disso, adicionaram várias flags embutidas, sobre as quais falaremos agora.
Abordagem 1: Diretivas #if clássicas — o parente mais próximo do #ifdef
\n\nA forma mais direta é usar #if com condições predefinidas:
#if DEBUG\n print("Esta é uma compilação de depuração")\n // Aqui pode haver logging, verificações adicionais\n#else\n print("Esta é uma compilação de produção")\n#endif\n\nAqui está uma lista de flags embutidas que você pode usar:
\n\n- \n
DEBUG— automaticamente definido para a configuração Debug (o Xcode adiciona por conta própria) \n os(iOS),os(macOS),os(tvOS),os(watchOS)— verificação de plataforma \n arch(x86_64),arch(arm64),arch(i386),arch(arm)— arquitetura do processador \n swift(>=5.0)— versão da linguagem Swift \n canImport(UIKit)— verificação de disponibilidade do módulo \n targetEnvironment(simulator)— execução no simulador \n
Exemplo de verificação combinada:
\n\n#if os(iOS) || os(tvOS)\n import UIKit\n typealias PlatformView = UIView\n#elseif os(macOS)\n import AppKit\n typealias PlatformView = NSView\n#else\n typealias PlatformView = Any\n#endif\n\nEste código cria um alias único para a classe de view que funciona em diferentes plataformas. Muito útil para bibliotecas multiplataforma!
\n\nAbordagem 2: Active Compilation Conditions — seu próprio #ifdef
\n\nE se você precisar adicionar sua própria flag que não está no conjunto padrão? Por exemplo, BETA_FEATURES ou PAYMENT_INTEGRATION. Para isso, o Xcode possui as Active Compilation Conditions (condições de compilação ativas).
Como configurar:
\n- \n
- Abra o projeto no Xcode \n
- Selecione target → Build Settings → Swift Compiler — Custom Flags \n
- Encontre o campo Active Compilation Conditions \n
- Adicione suas flags separadas por espaço, por exemplo:
BETA PAYMENT_V2\n
No código, usamos assim:
\n\n#if BETA\n print("Versão beta iniciada")\n showBetaUI()\n#endif\n\n#if PAYMENT_V2\n let paymentProcessor = NewPaymentProcessor()\n#else\n let paymentProcessor = LegacyPaymentProcessor()\n#endif\n\nEsta é uma substituição direta do #ifdef de C/C++! Você mesmo decide