#ifdef em Swift: como substituir a compilação condicional de C/C++

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

"Onde está o #ifdef?" — a primeira pergunta de um desenvolvedor C em Swift

\n\n

Se 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\n

Neste 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\n

Por que o Swift não tem #ifdef (e isso é bom)

\n\n

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

\n\n

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.

\n\n

Abordagem 1: Diretivas #if clássicas — o parente mais próximo do #ifdef

\n\n

A forma mais direta é usar #if com condições predefinidas:

\n\n
#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\n

Aqui 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
\n\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\n

Este código cria um alias único para a classe de view que funciona em diferentes plataformas. Muito útil para bibliotecas multiplataforma!

\n\n

Abordagem 2: Active Compilation Conditions — seu próprio #ifdef

\n\n

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

\n\n

Como configurar:

\n
    \n
  1. Abra o projeto no Xcode
  2. \n
  3. Selecione target → Build Settings → Swift Compiler — Custom Flags
  4. \n
  5. Encontre o campo Active Compilation Conditions
  6. \n
  7. Adicione suas flags separadas por espaço, por exemplo: BETA PAYMENT_V2
  8. \n
\n\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\n

Esta é uma substituição direta do #ifdef de C/C++! Você mesmo decide

Blogs

Book Recommendations