如何在Xcode调试时更改let变量的值?

3

我正在Xcode(Xcode 12)的调试过程中尝试更改一个let值。但是,当我尝试使用调试器命令时:

expression isLongBoxRide = true

我在Xcode调试器终端中遇到了这个错误。"error: cannot assign to value: 'isLongBoxRide' is immutable isLongBoxRide = true" 在调试时,它不允许我更改let值。当我尝试更改一个var时它是可以工作的。我只是好奇是否有可能在Xcode调试过程中更改let值。如果这是可能的话,那将非常好。


你可以将其定义为一个变量,在完成调试过程和测试后,如果不需要它作为可变值,可以将其更改为"let"。 - undefined
2
为什么这样会好呢?如果它是用let声明的,它将永远不会有其他值。你将在一个程序无法达到的状态下进行调试。 - undefined
3个回答

4
问题在于编译器可能会在编译时分析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 Swift状态与底层的lldb“看到”的状态不同时,事情可能变得更加混乱。这是一条可能导致未定义行为的恶劣路径。 - undefined
啊,有道理。希望能够实现,但我猜不行。谢谢! - undefined

2
据我所知,Let关键字是不可更改的,这正是Let存在的全部意义。您将其设定为一个常量。如果您想要更改它,请使用var作为一个变量。

2
据我所知,letvar不仅是代码的外观装饰。它们涉及物理内存管理。常量let存储在堆中,而var存储在栈中。这会影响访问时间。因此,您基本上不能更改let变量而不破坏内存堆栈。
您可以尝试在DEBUG编译中使用var,在RELEASE中使用let,例如:
#if DEBUG
var foo: Bar
#else
let foo: Bar
#endif

1
“let” 存储在堆中,而 “var” 存储在栈中 - 你有任何支持这一说法的文档吗? - undefined

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