Swift 使用#if、#endif 的错误

Swift errors using #if, #endif

在Swift(使用Xcode)中使用#if、#endif,如果它切入操作流程会产生错误。这张截图说明了一切:

有谁知道无需重复整个代码块两次即可使此示例正常运行的解决方案?很容易出现整个块非常大的情况。

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

您可以使用以下代码简单地实现此案例:

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

如@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
}

理想情况下,尽可能限制 #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 ...