为什么Xcode的variables视图的“编辑值”不改变variables值?

在Xcode的variables视图中,在debugging区域的右侧,当应用程序正在运行并在断点处暂停时,可以右键单击variables并select“编辑值”。

对于一个快速的string是灰色的,我可以想像为什么可能是这样的。 但即使对于一个简单的int,它也会popup一个编辑框来input一个新的值,但是在这个值之后,这个值保持原来的值。 即使在代码中更改的variables也是如此。

更新:如下面Jim的答案所示,您应该可以使用lldbexpression式命令来设置值,但是尽pipeXcode会告诉您它已经改变,但是它实际上并没有改变这个值。

这是打破了,还是有什么具体的,你需要做的工作? 谢谢。

截图

更新:这是一个编译错误 – 请参阅Jim的评论 。 这是一个解决方法…

println("Before lldb change, foo is \(foo)") //make compiler think foo may change, so I can change it myself at the console if count("abcd") == 0 { foo = 0 } println("After lldb change, code now thinks foo is \(foo)") 

大多数Swift实体,对于确定的string,但即使是“简单的”types,如Int,实际上也不是简单的types。 您在variables视图中看到的值是由lldb中的数据格式化器构build的,这些数据格式化器被设置为呈现值的有用视图,而不运行任何代码(出于性能方面的原因)。他们知道如何在Swifttypes,但是我们没有教他们如何编辑价值观,只呈现它们。

如果你想改变一个值,你需要在你的程序中运行一些代码来做到这一点,你可以在lldb控制台中使用expression命令。 例如,如果你有一个叫做foo的Intvariables,你可以这样做:

(lldb)expr foo = 12

这将编译和执行该代码片段,当然,Swift编译器确实知道如何修改这些Swift值,所以生成的代码将正确设置值。

请注意,它看起来似乎swift编译器有时将值复制到一个寄存器,并从debugging信息中指示事实的registry中使用它。 如果发生这种情况,lldb会报告它在debugging信息指向的位置设置的值,但代码实际上会使用临时值。 我用swift编译器提出了一个bug,certificate了这个的一个实例。

在整数常量的情况下,你不能直接设置任何东西。

然而让我们假设你有一个variables作为parameter passing给你的函数:

value = (AnyObject!) Int64(38) instance_type = (Builtin.RawPointer) 0xb000000000000263

请注意,从1开始的这个地址不是一个真正的指针。 现在让我们假设你想用64replace值38。

po Unmanaged.passUnretained(64).toOpaque()你有一个神奇的常量64的伪地址:

0xb000000000000403 - _rawValue : (Opaque Value)

那么你用0xb000000000000403代替0xb000000000000263,你有你的不断变化。

上帝,我爱Swift