我不确定这是否有帮助,但实际情况比您想象的要复杂一些。
Swift 字符串实际上是结构,所以如果你在分配给self.text.label 之前停在行上,并为你的label var 分配一个新值,你实际上是在改变结构的内容,这应该由所有权利意味着当您从该结构分配给self.text.label 时,它确实应该获取新值...
不起作用的原因是 swift 编译器很聪明地对这些结构进行拆箱,这样它就不会在可能的情况下进行不必要的取消引用。即使在-Onone 也会发生这种情况。
因此,例如,在您的示例中,快速编译的代码已经将字符串拆箱并发出直接引用内容的代码。更改实际字符串内容不会更改对已在分配代码中的未装箱内容的引用,因此您的更改不会发生。
你可以看到这个IRL:如果你让编译器无法知道字符串的内容是什么,它就不能做这个拆箱,然后你会看到你的调试器更改生效。
使用此示例代码:
class HasLabel
{
var label : String = "Default Value"
}
func
main ()
{
var myLabel = HasLabel()
var string = "set in code"
string.removeSubrange(string.startIndex..<string.endIndex)
string.append("Different string in code")
myLabel.label = string // Set a breakpoint here
print ("Did it change? string: \"\(string)\" Label: \"\(myLabel.label)\"")
}
main()
在调试器中,我看到了:
(lldb) br s -p "Set a breakpoint here"
Breakpoint 1: where = tryme`tryme.main () -> () + 499 at tryme.swift:14, address = 0x0000000100001e93
(lldb) run
Process 8323 launched: '/private/tmp/tryme' (x86_64)
Process 8323 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100001e93 tryme`tryme.main () -> () at tryme.swift:14
11
12 string.removeSubrange(string.startIndex..<string.endIndex)
13 string.append("Different string in code")
-> 14 myLabel.label = string // Set a breakpoint here
^
15 print ("Did it change? string: \"\(string)\" Label: \"\(myLabel.label)\"")
16 }
17
(lldb) expr string = "Set in debugger"
(lldb) c
Process 8323 resuming
Did it change? string: "Set in debugger" Label: "Set in debugger"
Process 8323 exited with status = 0 (0x00000000)
您会看到实际发生的调试器更改。但是如果你把string.removeSubrange和string.append注释掉,那么这个改动就不再需要了。