Search code examples
swiftxcodepreprocessorcompiler-directives

Swift errors using #if, #endif


Using #if, #endif in Swift (using Xcode) produces errors if it cuts into the flow of an operation. This screenshot says it all:

Swift #if, #endif error

Does anyone know a solution to make this example work, without repeating the entire code block twice? There can easily be situations where the entire block can be very large.

EDIT: My sample was a bit too simple. Here is a new sample where the "else if" depends on the same define (DEBUG). The "else if" must also be within the #if and #endif. And other samples can be much more complex than this.

enter image description here


Solution

  • Ideally, limit the usage of #if as much as possible. Using preprocessor directives is always a bit of a code smell. In this case, you can simply use a boolean variable:

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

    Then simply use the variable:

    var a = 0
    var b = 0
    
    ...
    
    else if debug && a == b {
    }
    

    In release mode the code will become unreachable and the optimizer will remove it anyway.

    With a bit of imagination, we can find other solutions, for example, we can move the check to a function:

    func isDebugCheck(a: Int, b: Int) -> Bool {
       #if DEBUG
          return a == b
       #else
          return false
       #endif
    }
    

    or we can move the whole code to a separate function and replace if-else by a return (or continue, depending on you needs), e.g.:

    if a == 7 {
      ...
      return
    }
    
    #if DEBUG
      if a == b {
         return
      }
    #endif
    
    if ...