使用#if,#endif的Swift错误

时间:2019-03-12 15:19:18

标签: swift xcode preprocessor compiler-directives

在Swift中使用#if,#endif(使用Xcode)会切入操作流程,从而产生错误。该屏幕快照说明了一切:

Swift #if, #endif error

有没有人知道一种解决方案,可以使此示例正常工作,而无需重复整个代码块两次?很容易出现整个区块很大的情况。

编辑:我的示例有点太简单了。这是一个新示例,其中“ else if”取决于相同的定义(DEBUG)。 “ else if”也必须在#if和#endif之内。其他样本可能比这复杂得多。

enter image description here

3 个答案:

答案 0 :(得分:5)

理想情况下,请尽可能限制#if的使用。使用预处理程序指令总是有点代码味道。在这种情况下,您可以简单地使用布尔变量:

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

然后只需使用变量:

var a = 0
var b = 0

...

else if debug && a == b {
}

在发布模式下,代码将变得不可访问,并且优化器仍将删除它。

有点想像力,我们可以找到其他解决方案,例如,可以将检查移到一个函数上:

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

或者我们可以将整个代码移到一个单独的函数中,并用if-else(或return,视您的需要)替换continue,例如:

if a == 7 {
  ...
  return
}

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

if ...

答案 1 :(得分:2)

正如@ user28434所指出的,没有源级别的预处理器。这消除了C语言中许多非常棘手的预处理器问题(例如,括号使工作正常的奇异需求)。

但是,#if已很好地集成到该语言中,并针对此类情况专门支持switch

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
}

答案 2 :(得分:1)

您可以使用以下代码轻松实现这种情况:

if a == b {
    #if DEBUG
    a += 2
    #else
    a += 1
    #endif
} else if a == c {
    a += 3
}