Swift布尔值<invalid>

11
附加的屏幕快照说得很清楚:我有一个有效的 true 布尔值,使用取反运算符将其取反后,(Xcode 告诉我)我有一个无效值。
看起来这个“无效”值的行为就像它是 false 一样。但真的,什么鬼? 在此输入图像描述

1
该布尔值的内存要么从未被初始化,要么以某种方式被损坏。Bool 的唯一有效值为 0x01true)和 0x00false)。 - Alexander
我怀疑自从调试会话开始以来,这段代码已经被编辑过了,而且代码并不反映程序的状态。 - Alexander
1
顺便提一下,这个代码可以更简单地写成 adFreeButton.isEnabled = !PurchaseState.isAdfree - Alexander
1
轻松点,没必要防守哈哈 - Alexander
Andreas的评论可能是答案。顺便说一句,在Playground中最简单的示例不会表现出这种行为。我会尝试创建一个示例,但根据Andreas的说法,这可能非常依赖于上下文。 - Andrew Duncan
显示剩余5条评论
3个回答

1
我曾在Xcode 8.3.1和Swift 3.1中遇到此问题https://github.com/onmyway133/notes/issues/278
我尝试了以下操作:
  • 清理构建文件夹并删除派生数据文件夹
  • 删除应用程序
  • 重置模拟器
  • 重新启动Xcode
  • 重新启动Mac
但是这些方法都不起作用。解决方法是:
let enabled = disable ? false : true

0

我不是LLVM专家,但对于这种行为一点也不感到惊讶,除非优化设置为Onone,否则它应该让你的代码保持原样。毕竟,中间变量只是要被优化掉。


然而(我应该指定这一点),在方法后面多次使用了enabled和disabled。 (这就是为什么我定义了* enabled disabled 的部分原因:代码读起来更好,很难无意中省略bang negation符号。)实际上,在调试器暂停时,正好有一个地方正在使用(显然虚假的)值。 最后,在调试模式下,我的优化设置是*-Onone。 - Andrew Duncan
我也会自由地声明变量,但无论我使用它们多少次,我仍然期望它们会消失并被更好的东西所取代。如果你的截图实际上来自调试运行,正如你所暗示的那样,那么恐怕你必须等待更有经验的人来解决问题。 - Andreas
我同意编译器在可证明正确的情况下可以自由重新排列本地变量。(我是一名编译器编写者。你会同情我必须向学生解释“不,更少的本地变量并不意味着更高效的代码”的次数。)但是,是的,截图是Xcode调试器的。这可能是Swift运行时中的一个无害错误。无害是因为控制流确实将0xfe(又名-2)处理为false。 - Andrew Duncan
我认为你误解了我的“调试运行”的意思——这不是关于截图是否来自调试器的问题,而是关于在Xcode中运行时使用哪个构建配置。debug配置(带有Onone)是默认的,但并非必需。 - Andreas
我明白了,这是使用-Onone的调试配置。 - Andrew Duncan

0

遇到同样的问题,使用了正确的添加代码,例如print(theBoolValue)

但是当在Swift命令行中使用p,或者仅在调试堆栈中检查该值时,该值变为<invalid>(Oxfe)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接