En ausencia de macros de preprocesador, ¿hay una manera de definir banderas específicas de esquema práctico a nivel de proyecto en Xcode project


Antes de swift 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 eliminar ciertos comportamientos a nivel de proyecto. El ejemplo más simple es la macro DEBUG=1 que se define por defecto para todos los proyectos Xcode en el esquema predeterminado para la compilación Run. Uno podría consultar # ifdef DEBUG ... y tomar decisiones en el código en consecuencia, incluso compilando código no necesario.

Parece que este tipo no es tan fácil usar swift, ya que las macros no son compatibles. Puede alguien sugerir un enfoque comparable, no me importa si el código se compila, per se. Sin embargo, me gustaría crear funciones basadas en el esquema de compilación.

 165
Author: Sahil Kapoor, 2014-06-09

4 answers

En Swift todavía puede usar las macros del preprocesador "#if/#else/#endif" (aunque más restringidas), según Apple docs. He aquí un ejemplo:

#if DEBUG
    let a = 2
#else
    let a = 3
#endif

Ahora, debe establecer el símbolo "DEBUG" en otro lugar, sin embargo. Póngalo en la sección "Swift Compiler - Custom Flags", en la línea "Other Swift Flags". Se agrega el símbolo de DEPURACIÓN con la entrada -D DEBUG.

(Configuración de compilación - > Compilador Swift-Banderas personalizadas) introduzca la descripción de la imagen aquí

Como de costumbre, puede establecer un valor diferente cuando en Debug o cuando en Lanzar.

Lo probé en código real; no parece ser reconocido en un patio de recreo.

 443
Author: Jean Le Moignan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-13 07:12:16

Nos encontramos con un problema con no querer establecer indicadores de compilador swift porque no queríamos tener que configurarlos y mantenerlos actualizados para diferentes objetivos, etc. Además, en nuestra base de código mixta, no queríamos recordar establecer 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 el .m

PreProcessorMacros.m

#ifdef DEBUG
    BOOL const DEBUG_BUILD = YES;
#else
    BOOL const DEBUG_BUILD = NO;
#endif

Luego, en tu Encabezado de Puente Objective-C

#import "PreProcessorMacros.h"

Ahora, use esto en su base de código Swift

if DEBUG_BUILD {
    println("debug")
} else {
    println("release")
}

Esto es definitivamente una solución alternativa, pero resolvió nuestro problema, así que lo publiqué aquí con la esperanza de que ayude. No pretende sugerir que las respuestas existentes son inválidas.

 29
Author: Logan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-22 20:23:23

Más solución swifty al método Logans. Establece -D DEBUG en Other Swift Flags de la sección Swift Compiler - Custom Flags en la configuración de compilación de tu destino.

Luego declare el siguiente método en el ámbito global:

#if DEBUG
let isDebugMode = true
#else
let isDebugMode = false
#endif

Ahora úsalo como

if isDebugMode {
    // Do debug stuff
}
 6
Author: Sahil Kapoor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-21 12:13:26

Estoy trabajando en una base de código de lenguaje 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 swift...

  1. He creado un método de clase en una de mis clases obj-c que es una envoltura alrededor de esa macro.
  2. Agregué ese encabezado obj-c a nuestro archivo de encabezado bridge.
  3. Ahora mi código swift llama a ese método de clase como un "proxy" al obj-c macro.

Es ligeramente molesto que no pueda llamar a la macro directamente en el código swift, pero al menos ahora solo tengo un lugar en el proyecto para preocuparme de activar/desactivar mi bandera de depuración.

 0
Author: ghostatron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-01 20:16:54