コピー2019.05.03Swiftにはオプショナル型というものが存在し、このおかげで言語としてnull安全が保たれています。オプショナル型の概念を知ること自体はそこまで難しくはありませんが、オプショナルを解除するアンラップと呼ばれるものにやり方がいくつかあって頭の整理が大変です。そこで今回の記事では、オプショナル型の概念と2種類のオプショナル型について軽く触れた後、アンラップ方法を大きく4パターンに分けて整理してみます。CoalescingOptionalChaining参考リンクオプショナル型と非オプショナル型オプショナル型というのはnil(他言語におけるnullみたいなもの)を格納することができる型です。勘違いのないようにいっておくと、「nilだけを」代入できる型ではなく「nilも」代入できる型です。逆に非オプショナル型はnilを代入することはできません。Swiftに存在する変数・定数の型は、まずオプショナル型(Optional)か非オプショナル型(non-Optional)かに大別できます。その中で、オプショナルのString型、オプショナルのInt型、非オプショナルのString型、非オプショナルのArray型などが細かく分かれていくイメージです。オプショナルのStringと非オプショナルのStringは全く違う型です。サブクラスとかとは訳が違うので注意してください。ここまででわかるように、オプショナルのString型やオプショナルのInt型は存在すれど、「オプショナル型」などというものは実体として存在しないことがわかるかと思います。オプショナルのString型は「オプショナル型とString型で2つの型を持っている」みたいなイメージに捉えられがちですが、オプショナルのString型はオプショナルのString型という1つの型です。同様に「非オプショナル型」なんてものもありません。あるのは「非オプショナルの〜〜型」です。「String型」というのもありません。Stringは「String型」ではなく「非オプショナルのString型」です。ところでなぜこんな勘違いがされやすいのかといえば、例えばnon-OptionalのString型を宣言する時の表記方法が、他の言語における「普通のString型」を表記する形と似ているので、それが「non-OptionalのString型」だと明確に認識しにくいからかだと思われます。String?と?がつくので分かりやすいのに対して、(ちなみにString?はOptional<String>のシンタックスシュガーです。Stringだけなので、あたかもこれが「只のString型」だとイメージしてしまいます。「非オプショナルのString型」と表記すべきであることがわかったかと思います。いちいち「非オプショナルの〜〜型」なんて表記するのは面倒臭いので、「非オプショナルの〜〜型」のことを単に「〜〜型」と表記することがほとんどです。この記事でもここからは普通に「〜〜型」と書いた時、それは暗に「非オプショナルの〜〜型」を指していることにします。str2:Stringは「オプショナルのString型」と「String型」で全く違う型だということが分かりました。そのため、「オプショナルのString型」であるstr1では、String型で使えるuppercased()メソッドやcountプロパティなどにアクセスできません。str1はオプショナルのString型で宣言してしまったが、入れた文字列の文字数をカウントしたいのでやっぱりString型に直したい!なんて時が出てくるかと思います。ここでオプショナルの〜〜型を非オプショナルの〜〜型に変換することをアンラップ(Unwrap)と呼びます。「オプショナルのString型」と「String型」のイメージとして、オプショナルというラップをString型に被せると「オプショナルのString型」になる、みたいなイメージがよく使われます。このイメージでいうと、「オプショナルのString型」はオプショナルというラップを剥がせば「String型」になります。アンラップのイメージはこんな感じです。オプショナル型と暗黙的アンラップオプショナル型オプショナル型はさらに2つに分類できます。Optional)です。通常のオプショナル型は型名の後に?をつけて宣言します。非オプショナル型にアンラップするには、下で紹介するような明示的なアンラップが必要です。暗黙的アンラップオプショナル型は型名の後に!をつけて宣言します。その後その変数・定数に参照する時には、非オプショナル型に強制的にアンラップされます。明示的なアンラップ処理は必要ありません。その分、もし中身がnilだった時に強制的にアンラップしてしまうとエラーになってしまいます。不要(元々non-Optional)アンラップのやり方4パターンオプショナル型の場合、暗黙的アンラップオプショナル型と違って明示的にアンラップをする必要があります。アンラップのやり方は大きく分けて4種類あります。ForcedUnwrapping(強制アンラップ)str!のように変数名の後に!をつけると、強制的にOptionalが剥がされアンラップされます。そのためnilが入ったままアンラップしてしまう可能性があり、アプリのクラッシュが起こりえます。//hogeにnilが入ったままString型にアンラップするのでエラーOptionalBinding実際の開発では一番よく見る形で、nilチェック(変数・定数にnilが入っていないかどうかをチェック)とアンラップを同時に行うやり方です。3パターンほどやり方があります。let構文ifブロックの中でアンラップされた変数・定数を使っていきます。現場ではよく、アンラップ前の変数とアンラップ後の変数を同じ名前にするシャドーイングというテクニックが使われます。ifブロックを抜けるとアンラップされた変数のメモリ区画は解放されてしまうので、アンラップされた変数を使いつつ続けて他のアンラップ処理も行いたい場合は、ネストがどんどん深くなってしまいます。let構文の時のhoge:Stringが、var宣言なので再代入可能になるだけです。使わないかと思います。let構文guard文を使うとブロック外までシャドーイングが継続する上、早期リターンで深いネストを生じさせないので一般的には可読性の高いコードになります。Coalescing??演算子を使って、オプショナル型の変数の後に、もしnilが入っていた時に代わりに使うリテラルを記述します。Stringと出力OptionalChainingオプショナルの〜〜型に対して、非オプショナルの〜〜型のメソッドやプロパティにアクセスしようとした時、?をつけてからアクセスします。nilが入っていたらその参照を取りやめ、値がちゃんと入っていたらアンラップしてアクセスしてくれます。対象のオプショナル自体がアンラップされて取り出されるわけではないので、他のパターンと組み合わせて使うことが多いです。この場合はhogeに値が入っているので実行されるしかしアンラップされるのはあくまでアクセス時の一瞬のみなので、返り値はOptional("HELLO")とOptional型のままになってしまいます。}print(uppercased)のようにして、他のアンラップ方法と組み合わせます。使う場面があるでしょう。コピーut3をフォローするut3iOSも少々できるWebエンジニアut3をフォローするut3Utarog関連記事Programming【Python】enumerate関数の使い方!アンパックとの組み合わせが便利pythonのenumerate関数って便利ですね。引数にシーケンスを指定すると、カウント(≒インデックス)と要素をまとめたタプルを返してくれます。...ProgrammingMassAssignment脆弱性に関するアンチパターン例と対策PHPを使ってWebサービスを開発していた時、いわゆるMassAssignment脆弱性に該当するセキュリティホールを発見してしまいました。初心者エンジニアはついつい飛ばしてしまいがちなセキュリティですが、その重要性を改めて認識しました...AWSCloud9でPython3環境構築入門!【AWS】PyQさんのおかげもあってPythonの文法や、簡単なWebアプリの開発周りについてはなんとなくわかってきました。なんでそろそろポートフォリオ作りたいなと思い、まずPyQから離れてプログラムを書き始めようと思ったわけです。普通にQiitaとかの解説記事を読んでいるだけではなかなか理解しにくいですが、これらの大元の原理となっているARCについて知っておけばするする頭に...ProgrammingFileZillaでFTP接続失敗を解決、ついでにSFTP接続にしてみたFTPツールにはFileZillaを使っている人が多いかと思います。今回レンタルサーバーのファイルを弄ろうと久々にFileZillaで接続してみたのですが、なぜか接続ができなくなっていました。問題の解明から解決方法...JavaScriptJavaScriptの非同期処理をできる限り正確に理解するプログラミング初心者が詰まりやすいポイントとして、非同期処理はよくあげられるかと思います。コメントをキャンセルメールアドレスが公開されることはありません。*サイト上に表示された文字を入力してください。【Swift】frameとboundsの違いは?UIViewにどう影響するのか【Swift】オプショナル型とは?4種類のアンラップ方法と共に解説!【Angular】html文書をエスケープしないでそのままtemplateに表示するアーカイブ2019年9月2019年5月2019年4月2019年3月2019年2月カテゴリーAngularAWSCSSDockerExcelJavaScriptMySQLPHPProgrammingPythonSwiftタイトルとURLをコピーしました。