【问题标题】:Swift errors using #if, #endif使用 #if、#endif 的 Swift 错误
【发布时间】:2019-03-12 15:19:17
【问题描述】:

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

有没有人知道一个解决方案可以使这个例子工作,而不用重复整个代码块两次?很容易出现整个块可能非常大的情况。

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

【问题讨论】:

  • C/Objective C 不同,# 关键字不是由pre-processor 解析,而是由与swift 代码的其余部分相同的解析器解析。所以它们必须遵循相同的句法规则,不能直接切入代码。
  • 邮政编码而不是截图。
  • 我听到你在说什么 user28434。这是一个真正的限制。我希望有人有办法让它在不重复大量代码的情况下工作。
  • Dharmesh,我使用了一个屏幕截图,这样它也会显示 Xcode 显示的错误。我本可以说明错误,但有时一张图片会让事情更清楚。

标签: swift xcode preprocessor compiler-directives


【解决方案1】:

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

【讨论】:

  • 谢谢苏丹。我正在使用这样的解决方案。在执行实际到达“if else”之前设置“if else”的结果似乎很愚蠢。不过好像没有别的办法了。
  • @msedore 您可以将 ifs 移动到 function 并将 if-else 替换为 if-return-else。或者只是将检查移至函数func isDebugCheck(a, b) { #if DEBUG return a == b #else return false }
  • 好主意!
【解决方案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
}

【讨论】:

  • 谢谢,但是 switch 语句只有效,因为我的示例很简单。正如我一直想说的,真实世界的样本可能要复杂得多,而不仅仅是比较单个整数。
【解决方案3】:

您可以使用以下代码简单地实现这种情况:

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

【讨论】:

  • 感谢您的回复。但是,如果“else if”语句中的条件也依赖于相同的定义(DEBUG),则该解决方案将不起作用。我的示例有点太简单了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
相关资源
最近更新 更多