Usar #if, #endif en Swift (usando Xcode) produce errores si interfiere en el flujo de una operación. Esta captura de pantalla lo dice todo:
¿Alguien sabe una solución para hacer que este ejemplo funcione, sin repetir el bloque de código completo dos veces? Fácilmente puede haber situaciones en las que todo el bloque puede ser muy grande.
EDITAR: Mi muestra era demasiado simple. Aquí hay una nueva muestra donde el "else if" depende de la misma definición (DEBUG). El "else if" también debe estar dentro de #if y #endif. Y otras muestras pueden ser mucho más complejas que esta.
Idealmente, limite el uso de #if tanto como sea posible. El uso de directivas de preprocesador siempre huele un poco a código. En este caso, simplemente puede usar una variable booleana:
#if DEBUG let debug = true #else let debug = false #endifEntonces simplemente usa la variable:
var a = 0 var b = 0 ... else if debug && a == b { }En el modo de lanzamiento, el código se volverá inalcanzable y el optimizador lo eliminará de todos modos.
Con un poco de imaginación, podemos encontrar otras soluciones, por ejemplo, podemos mover el cheque a una función:
func isDebugCheck(a: Int, b: Int) -> Bool { #if DEBUG return a == b #else return false #endif } o podemos mover todo el código a una función separada y reemplazar if-else por un return (o continue , según sus necesidades), por ejemplo:
if a == 7 { ... return } #if DEBUG if a == b { return } #endif if ...Como señala @ user28434, no hay un preprocesador de nivel de fuente. Esto ha eliminado muchos problemas complicados del preprocesador en C (como la extraña necesidad de paréntesis para que las cosas funcionen).
Sin embargo, #if está bien integrado en el lenguaje y admite específicamente el switch para este tipo de casos.
var a = 0 #if DEBUG let b = 0 #endif switch a { case 7: a += 1 #if DEBUG case b: a += 2 #endif case 5: a += 3 default: break }Simplemente puede lograr este caso con el siguiente código:
if a == b { #if DEBUG a += 2 #else a += 1 #endif } else if a == c { a += 3 }