Optional変数への代入
次のstrは何が代入されるでしょうか?
var str: String? = nil
str = "Hallo"
print(String(describing: str))
strにはHalloという文字列が代入されるので、strの結果は "Hallo"
になります。正確にはOptional("Hallo")
になります。
?付きOptional変数への代入
では、次のstrは何が代入されるでしょうか?
var str: String? = nil
str? = "Hallo" // ←?付き変数に代入する
print(String(describing: str))
先程と似たようなコードですが、先程のコードとは違ってstrには?
をつけて代入しています。
これはちゃんとビルドが通るコードですが、この場合、strの結果は nil
になります。
?付きの値のあるOptional変数へ代入
もう一つ、次のstrは何が代入されるでしょうか?
var str: String? = "Good Morning"
str? = "Hallo" // ←?付き変数に代入する
print(String(describing: str))
このコードも先程と同様、strはOptionalで定義されていますが、strは値を持っています。
この場合、strの結果は "Hallo"
になります。正確にはOptional("Hallo")
になります。
まとめ
ということで、?つきOptional変数への代入は、nilの場合は何もせず、値がある場合は代入する、という挙動になります。
str?.append("World")
のようなコードが、strがnilの場合は何もしないのと一緒の挙動ですね。
?付き変数への代入のコードはビルドできてしまうので、パッと見では気づかない、意図しない挙動を埋め込んでしまう可能性があるので気をつけましょう。