Apple incluyó soporte completo para los indicadores del preprocesador Swift a partir de Xcode 8 , por lo que ya no es necesario establecer estos valores en "Otros indicadores Swift".
La nueva configuración se llama "Condiciones de compilación activa", que proporciona soporte de nivel superior para el equivalente Swift de los indicadores del preprocesador. Lo usa exactamente de la misma manera que lo haría con "Otras banderas rápidas", excepto que no es necesario anteponer el valor con una "-D" (por lo que es un poco más limpio).
De las notas de la versión de Xcode 8 :
Active Compilation Conditions
es una nueva configuración de compilación para pasar indicadores de compilación condicional al compilador Swift. Cada elemento del valor de esta configuración pasa a swiftc con el prefijo -
D, de la misma manera que los elementos de Preprocessor Macros
pasan a clang con el mismo prefijo. (22457329)
Utiliza la configuración anterior así:
#if DEBUG
let accessToken = "DebugAccessToken"
#else
let accessToken = "ProductionAccessToken"
#endif
=1
... Perdí un poco de tiempo tratando de averiguar por qué no estaba funcionando cuando lo hice. Entonces, pensé en compartir este dato para ayudar al próximo compañero. :] De todos modos, ¡gracias por tu respuesta aquí!DEBUG
inActive Compilation Conditions
comoDEBUG=1
inPreprocessor Macros
y esta configuración no funciona en absoluto. ¿Debo eliminarDEBUG=1
? No está claro a partir de los comentarios anteriores.Build Configuration
primero . Consulte esta respuesta stackoverflow.com/questions/9063100/… para obtener más información.ACTUALIZADO: Xcode 8 ahora admite esto automáticamente, vea la respuesta de @ DanLoewenherz arriba.
Antes de Xcode 8, aún podía usar Macros de la misma manera:
#if DEBUG let apiKey = "KEY_A" #else let apiKey = "KEY_B" #endif
Sin embargo, para que Swift pueda recogerlos, debes establecer "Otras banderas Swift" en la configuración de construcción de tu objetivo:
-D
banderafuente
-D
prefijoComo observación de seguimiento, intente no mantener claves / secretos de la API en texto plano en el repositorio. Utilice un sistema de gestión de secretos para cargar las claves / secretos en las variables de entorno del usuario. De lo contrario, el paso 1 es necesario, si es aceptable.
../set_keys.sh
que contenga una lista deexport API_KEY_A='<plaintext_key_aef94c5l6>'
(use comillas simples para evitar la evaluación)source ../set_keys.sh
y muévala a la parte superior de la orden de ejecuciónAPI_KEY_A="$API_KEY_A"
Eso captura la variable de entorno en la definición del compilador que luego se usa en cada invocación de clang para cada archivo fuente.
Estructura de directorio de ejemplo
[10:33:15] ~/code/memo yes? tree -L 2 . . ├── Memo │ ├── Memo │ ├── Memo.xcodeproj │ ├── Memo.xcworkspace │ ├── Podfile │ ├── Podfile.lock │ └── Pods └── keys
fuente
En paquetes rápidos, debe hacer esto dentro del
swiftSettings
argumento.target
en suPackage.swift
archivo. Utilice eldefine
método (documentación de Apple) o la documentación de Swifttargets: [ .target(name: String, dependencies: [Target.Dependency], path: String?, exclude: [String]?, sources: [String]?,, cSettings: [CSetting]?, cxxSettings: [CXXSetting]?, swiftSettings: [SwiftSetting]?, linkerSettings: [LinkerSetting]?),
¡El mío se ve así y funciona!
swiftSettings: [ .define("VAPOR") ]
en mi código puedo compilar condicionalmente usando esto:
#if VAPOR
fuente