A Apple incluiu suporte completo para sinalizadores de pré-processador Swift a partir do Xcode 8 , então não é mais necessário definir esses valores em "Outros sinalizadores Swift".
A nova configuração é chamada de "Condições de compilação ativa", que fornece suporte de nível superior para o equivalente Swift dos sinalizadores de pré-processador. Você o usa exatamente da mesma maneira que faria com "Outros sinalizadores Swift", exceto que não há necessidade de acrescentar um "-D" ao prefixo (portanto, é apenas um pouco mais limpo).
Das notas de lançamento do Xcode 8 :
Active Compilation Conditions
é uma nova configuração de construção para passar sinalizadores de compilação condicional para o compilador Swift. Cada elemento do valor desta configuração passa para swiftc prefixado com -D
, da mesma forma que elementos de Preprocessor Macros
passam para clang com o mesmo prefixo. (22457329)
Você usa a configuração acima assim:
#if DEBUG
let accessToken = "DebugAccessToken"
#else
let accessToken = "ProductionAccessToken"
#endif
=1
... Perdi um pouco de tempo tentando descobrir por que não estava funcionando quando eu fiz. Então, pensei em compartilhar este boato para ajudar o próximo companheiro. :] De qualquer forma, obrigado pela sua resposta aqui!DEBUG
emActive Compilation Conditions
eDEBUG=1
emPreprocessor Macros
e esta configuração não funciona de todo. Devo removerDEBUG=1
? Não está claro nos comentários acima.Build Configuration
primeiro o seu alvo . Verifique esta resposta stackoverflow.com/questions/9063100/… para obter mais informações.ATUALIZADO: o Xcode 8 agora suporta isso automaticamente, consulte a resposta de @DanLoewenherz acima.
Antes do Xcode 8, você ainda podia usar macros da mesma maneira:
#if DEBUG let apiKey = "KEY_A" #else let apiKey = "KEY_B" #endif
No entanto, para que eles sejam captados pelo Swift, você precisa definir "Outros sinalizadores Swift" nas configurações de construção do seu alvo:
-D
sinalizadorfonte
-D
prefixoComo observação de acompanhamento, tente não manter as chaves / segredos da API em texto simples no repositório. Use um sistema de gerenciamento de segredos para carregar as chaves / segredos nas variáveis de ambiente do usuário. Caso contrário, a etapa 1 é necessária, se aceitável.
../set_keys.sh
que contenha uma lista deexport API_KEY_A='<plaintext_key_aef94c5l6>'
(use aspas simples para evitar avaliação)source ../set_keys.sh
e mova-a para o topo da ordem de execuçãoAPI_KEY_A="$API_KEY_A"
Isso captura a variável de ambiente na definição do compilador, que é usada posteriormente em cada invocação do clang para cada arquivo de origem.
Exemplo de estrutura de diretório
[10:33:15] ~/code/memo yes? tree -L 2 . . ├── Memo │ ├── Memo │ ├── Memo.xcodeproj │ ├── Memo.xcworkspace │ ├── Podfile │ ├── Podfile.lock │ └── Pods └── keys
fonte
Em pacotes swift, você tem que fazer isso dentro do
swiftSettings
argumento.target
em seuPackage.swift
arquivo. Use odefine
método (documentação da Apple) ou documentação do Swifttargets: [ .target(name: String, dependencies: [Target.Dependency], path: String?, exclude: [String]?, sources: [String]?,, cSettings: [CSetting]?, cxxSettings: [CXXSetting]?, swiftSettings: [SwiftSetting]?, linkerSettings: [LinkerSetting]?),
O meu é assim e funciona!
swiftSettings: [ .define("VAPOR") ]
no meu código, posso compilar condicionalmente usando isto:
#if VAPOR
fonte