在Swift中使用#if,#endif(使用Xcode)会切入操作流程,从而产生错误。该屏幕快照说明了一切:
有没有人知道一种解决方案,可以使此示例正常工作,而无需重复整个代码块两次?很容易出现整个区块很大的情况。
编辑:我的示例有点太简单了。这是一个新示例,其中“ else if”取决于相同的定义(DEBUG)。 “ else if”也必须在#if和#endif之内。其他样本可能比这复杂得多。
答案 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
}