※ある意味「一発ネタ」です
問
君は**!
より怖い強制アンラップ**を知っているか?
答
それは、
var unsafelyUnwrapped: Wrapped { get }
だ。
解説
AppleのDocumentationを読んでいただければ解る話ですが、改めて説明しましょう。
!
は、前回の記事で少し触れましたが、SIL(Swift Intermediate Language)を生成する段階でその動作が挿入されます。動作としては、「万が一アンラップしようとしている対象がnil
だった場合にはfatal errorでプログラムを異常終了させる」というものになります。
しかしvar unsafelyUnwrapped
は違います。アンラップしようとしている対象がnil
だった場合(且つReleaseビルドの場合)、何も無かったことにします。つまり、その場合の返り値は、なんら関係ないオブジェクトだったり、未知のメモリ領域を指し示すポインタだったり、何でもありです。
前述のDocumentationにも
Accessing this property in the case of a
nil
value is a serious programming error and could lead to undefined behavior or a runtime error.(YOCKOW拙訳)
nil
の場合にこのプロパティへアクセスすることは深刻なプログラミングエラーであり、未定義動作やランタイムエラーをもたらすであろう😈
と書いてあります。
即ち「絶対にnil
でないことが保証されている値をアンラップする」場合で「少しでも速度を向上したいという要求」がある場合に限って使用しましょう。そんな場合があるのかどうかは分かりませんが。