【问题标题】:How to change a let value while debugging in Xcode?在 Xcode 中调试时如何更改 let 值?
【发布时间】:2021-01-26 10:27:02
【问题描述】:

我正在尝试在 Xcode (Xcode 12) 上进行中期调试时更改 let 值。但是,当我尝试这个调试器命令时

expression isLongBoxRide = true

我在 Xcode 调试器终端中收到此错误。 “错误:无法分配给值:'isLongBoxRide' 是不可变的 isLongBoxRide = true” 它不会让我在调试时更改 let 值。当我尝试更改 var 时它会起作用。我只是好奇是否可以在 Xcode 上调试时更改 let 值。如果可以的话,那就太好了。

【问题讨论】:

  • 您可以将其定义为变量,在完成调试过程和测试后,如果不需要它作为可变值,则将其更改为“let”
  • 如果它是let 声明它永远不会有任何其他价值,那为什么会很好?你会以它永远不会有的状态调试程序。

标签: ios swift xcode debugging


【解决方案1】:

问题在于编译器可能会在编译时分析 let 常量,然后优化您的代码。例如,想想这样的事情:

func x() -> String {
    let doit = false
    if (doit) {
        return "Yes"
    } else {
        return "No"
    }
}
// ...
let result = x()

一个聪明的编译器会把它改成

func x() -> String {
    return "Yes"
}
// ...
let result = x()

甚至完全抛弃x()的电话:

    let result = "Yes"

因此,根本没有doit 常量,特别是您的程序中不再有return "No" 分支。 这是一个极端的例子,编译器通常只会在发布模式下这样做,但是您可以看到在调试期间允许更改常量并不容易,因为编译器可能必须恢复一些优化。

【讨论】:

  • 此外,当 REPL 快速状态与 lldb 在后台“看到”的状态不同时,事情可能会变得更加混乱。这是一条很糟糕的路线,可能会导致未定义的行为。
  • 嗯是有道理的。希望可以,但我想不会。谢谢!
【解决方案2】:

据我所知 Let 是无法改变的,这就是 let 的全部目的。 你它有一个恒定的值 如果要更改,请使用 var 成为 variable

【讨论】:

    【解决方案3】:

    AFAIK letvar 不仅仅是代码的装饰。它涉及物理内存管理。 let 常量存储在堆中,而 var 存储在堆栈中。它影响访问时间。所以你基本上不能在不破坏内存堆栈的情况下更改 let 变量。

    您可以尝试使用var 进行调试编译,使用let 进行发布,例如:

    #if DEBUG
    var foo: Bar
    #else
    let foo: Bar
    #endif
    

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 1970-01-01
      • 2014-11-29
      • 2012-05-12
      • 2012-04-12
      • 2012-12-14
      • 1970-01-01
      • 2016-01-21
      相关资源
      最近更新 更多