私はこれが役立つとは確信していませんが、何が起こっているかは、あなたが考えるより少し複雑です。
スウィフト文字列は実際には構造体なので、self.text.label
に代入する前に行を停止し、label
varに新しい値を代入すると、実際に構造体の内容が変更されます。その構造体からself.text.label
に割り当てると、実際には新しい値が取り出されるはずです...
この構造体をアンボックスすることは、不必要にならないようにすばやくコンパイラがスマートです可能であれば逆参照。これは-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
をコメントアウトすると、変更はもう行われなくなります。
私はswiftについてのcrapballを知らないが、これがあなたがしていたことがうまくいかない場合...テキストにラベルを割り当てた後、同じ文字列へのポインタが2つになり、古いラベルでは、self.label.textが何を指しているかは変わりません... KVOが起こっていない限り... 'po self.label.text =" jones "'は何をしますか? –
もちろん、stringは構造体ですが、私は 'label'によって指された新しいものを作成していましたが、self.label.textはまだ古いものを指していました。ブリリアント! :) – Yotam