ios - objective - the swift programming language pdf
En ausencia de macros de preprocesador, ¿hay alguna manera de definir indicadores específicos del esquema práctico a nivel de proyecto en el proyecto Xcode? (4)
En Swift aún puede usar las macros del preprocesador "# if / # else / # endif" (aunque más restringidas), según los documentos de Apple . Aquí hay un ejemplo:
#if DEBUG
let a = 2
#else
let a = 3
#endif
Ahora, debe establecer el símbolo "DEBUG" en otro lugar, sin embargo. Colóquelo en la sección "Compilador Swift - Banderas personalizadas", en la línea "Otras banderas rápidas". Agregue el símbolo DEBUG con la entrada -D DEBUG
.
(Configuraciones de compilación -> Compilador Swift - Banderas personalizadas)
Como de costumbre, puede establecer un valor diferente cuando está en Debug o cuando está en Release.
Lo probé en código real; no parece ser reconocido en un patio de juegos.
Antes de nada, definiría un conjunto de esquemas para compilaciones alfa, beta y de distribución. Cada uno de estos esquemas tendría un conjunto de macros que se definieron para controlar ciertos comportamientos a nivel de proyecto. El ejemplo más simple es la macro DEBUG = 1 que se define de forma predeterminada para todos los proyectos de Xcode en el esquema predeterminado para la compilación Ejecutar. Uno podría consultar #ifdef DEPURAR ... y tomar decisiones en el código en consecuencia, incluso compilando código no necesario.
Parece que este tipo de sincronización configuracional no es tan fácil de usar con rapidez, ya que las macros no son compatibles. ¿Alguien puede sugerir un enfoque similar, no me importa si el código está compilado, per se. Me gustaría compilar características basadas en el esquema de compilación, sin embargo.
Estoy trabajando en una base de código de idioma mixto donde el código obj-c utiliza una macro para enviar mensajes de depuración a la consola (y esa macro se basa en nuestra bandera de preprocesador de depuración). Quería poder llamar a esa misma macro en el código rápido ...
- Creé un método de clase en una de mis clases obj-c que es un envoltorio alrededor de esa macro.
- Agregué ese encabezado obj-c a nuestro archivo de encabezado de puente.
- Ahora mi código rápido llama a ese método de clase como un "proxy" para la macro obj-c.
Es un poco molesto que no pueda llamar la macro directamente en el código rápido, pero al menos ahora solo tengo un lugar en el proyecto para preocuparme de activar / desactivar mi indicador de depuración.
Nos topamos con un problema al no querer establecer banderas de compilación rápidas porque no queríamos tener que configurarlas y mantenerlas actualizadas para diferentes objetivos, etc. Además, en nuestra base de código mixta, no queríamos recordar para configurar nuestras banderas apropiadamente todo el tiempo para cada idioma.
Para el nuestro, declaramos un archivo en ObjC
PreProcessorMacros.h
extern BOOL const DEBUG_BUILD;
En ellos
PreProcessorMacros.m
#ifdef DEBUG
BOOL const DEBUG_BUILD = YES;
#else
BOOL const DEBUG_BUILD = NO;
#endif
Luego, en su encabezado de puente de Objective-C
#import "PreProcessorMacros.h"
Ahora, usa esto en tu base de código Swift
if DEBUG_BUILD {
println("debug")
} else {
println("release")
}
Esto definitivamente es una solución, pero solucionó nuestro problema, así que lo publiqué aquí con la esperanza de que sea útil. No pretende sugerir que las respuestas existentes sean inválidas.
Una solución más rápida al método Logans. Establezca -D DEBUG
en Other Swift Flags
Swift Compiler - Custom Flags
de Swift Compiler - Custom Flags
sección Swift Compiler - Custom Flags
en la configuración de compilación de su objetivo.
Luego declara el siguiente método en alcance global:
#if DEBUG
let isDebugMode = true
#else
let isDebugMode = false
#endif
Ahora úsalo como
if isDebugMode {
// Do debug stuff
}