所以我一直在用 Swift 开发一个应用程序,今天我花了近一个小时调试一个问题,结果证明这是完全出乎意料的。这一切都是由下面的代码产生的。
if (hero.isAI) { //isAI is a Bool
}
问题是这个 if 语句总是返回 true。所以我想也许我在某个地方将 isAI 设置为 true 但最后我意识到我将 isAI 声明为可选类型,如下所示。
var isAI: Bool!
当它应该是
var isAI: Bool
这导致 if 语句不检查 isAI 是否为 true,而是检查它是否包含值。
所以为了安全起见,我确保像这样写我的 if 语句
if (hero.isAI == true) { //isAI is a Bool
}
所以我的问题是,我有什么选择可以避免将来出现这个问题?(这个问题看起来非常危险,尤其是在一个大型项目的团队中工作时)。
我是否应该始终显式地编写 if 语句,是否应该完全避免使用 Bools 的可选类型?
请注意,我在 Xcode Beta 2 中没有遇到此问题。当我升级到 Xcode Beta 3 时,出现了此问题。我认为是因为在 Beta 2 中,Apple 通过检查其值而不是检查它是否存在来处理 if 语句中隐式展开的 Bool包含一个值。
最后,下面是一个在给定可选 Bool 的情况下运行 if 语句的示例,以更好地帮助人们理解问题。
let myBool: Bool! = false
if (myBool) {
//Runs
}
if (myBool!) {
//Won't Run
}
if (!myBool) {
//Runs
}
if (myBool == true) {
//Won't Run
}
这是一个已知问题,正在跟踪SwiftInFlux回购协议,其中包括来自Chris Lattner 在 Apple 开发者论坛上.
任何符合以下条件的选项都存在此问题
LogicValue 协议(例如嵌套可选、bool 可选、
ETC)。我们认为这是一个严重的问题,需要在 1.0 中修复
有一些想法,但尚未确定解决方案。
因此,这个问题不仅影响可选 Bool,还影响任何符合 LogicValue 协议(定义为)的可选类型。
protocol LogicValue {
func getLogicValue() -> Bool
}
无论如何,就如何解决这个问题的建议而言,考虑到苹果尚未表明他们打算如何在未来解决这个问题,很难推荐任何一种具体的解决方案,但我想继续明确地检查Bool 的值将是要走的路。
if (hero.isAI == true) {
// stuff
}
事实上,经过进一步阅读,上面列出的引文继续如下:
对于这种常见情况,最简单的答案是生成一个
对“if x”发出警告并要求某人明确写入“if x !=
nil”或“if x == true”以明确他们想要什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)