6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Swift] 君は`!`より怖い強制アンラップを知っているか?

Posted at

※ある意味「一発ネタ」です

君は**!より怖い強制アンラップ**を知っているか?

それは、

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でないことが保証されている値をアンラップする」場合で「少しでも速度を向上したいという要求」がある場合に限って使用しましょう。そんな場合があるのかどうかは分かりませんが。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?