読み進めていく本↓
前回⇒「【Swift奮闘記ep8】オプショナルとは?(ラップ、オプショナルチェーン)」
一見オプショナルってわかりづらい概念的なめんどくさいやつかとおもいきや、意外と簡単だった。
今回はオプショナルでラップした変数を戻すアンラップについて見ていこう。
これが終われば基本的な文法が終わる!
では参ろう。
オプショナルの強制的なアンラップ
ラップしたのを元戻すからアンラップ。
値に!をつければよい。「なんだそれだけか」というくらい簡単だ。
var a: String? = “hello” // helloを代入してラップする。
var b = a?.uppercased( ) // 値を取り出す。ここではまだオプショナル型。
var c = b! // 強制的にアンラップする。
c.lowercased( ) // String型となるため、メソッドが使える。
変数aからhelloを取り出して、uppercased()した値を変数bに代入する。(1〜2行目)
ここまでは前回までの「値の取り出し」をしただけなので、変数bはオプショナル型である。
ここで変数cに変数bをアンラップして代入する。(HELLOが代入される。)
変数cはString型なのでlowercased()メソッドが使えて、”hello”となるわけだ。
なお、「var c = b!.lowercased( )」といっぺんにやってしまうこともできて、こちらのほうがスマートだ。
注意点
変数の中身が空だった場合、ランタイムエラーとなる。
ランタイムエラーとは実際にプログラムを動かす時に起こるエラーのこと。
iOSアプリは強制終了してしまう。
以下の場合のことを言う。
var time: String? = nil // 空ですよっと。
time!.uppercased( ) // アンラップして取り出そうとしても空なので取り出せませんよっと。
というわけだ。
なので強制的なアンラップを使う際は中身が空かどうかの確認をしっかりする必要がある。
これについては後ほど。
暗黙的なアンラップ
もうひとつアンラップする方法がある。それが暗黙的なアンラップだ。
(どの辺が暗黙的なのかはさっぱりわからないが。)
変数や定数の型注釈を指定するときに、自動的にアンラップするような機能
とあるがイマイチピンとこない。
まあ実際にどういったものか見てみると早い。
var fruits: String? = “apple” // 変数fruitsに文字列appleを代入、オプショナルにラップする。
var eating: String! = fruits // 変数eatingの型に!をつけることで暗黙的なアンラップをする。
eating.uppercased( ) // 変数eatingはSting型としてそのまま使えるわけだ。大文字に変換できた。
今更だけど、//はコメントの意味ね。
なお強制的なアンラップ同様、暗黙的なアンラップも変数の中身が空( )だったらランタイムエラーとなるので要注意。
オプショナルバインディング
強制的なオプショナル・暗黙的なオプショナル、どちらにおいても中身が空の場合、ランタイムエラー(アプリ起動時に強制終了となってしまうエラー)が発生するのだが、それを防ぐ方法がオプショナルバインディングだ。
(バインディングとは「束ねること」を意味し、直訳すると「オプショナルを束ねる」となってよくわからない。)
具体的に見てみよう。
空の変数にアンラップするとエラーになるので、If文を使って空じゃない時にだけ実行させる。
まずはオプショナルバインディングを使わずにチェックする方法。
var fruits: String? = “apple” // オプショナルにラップする。
if fruits != nil { //もし変数fruitsが空じゃなかったら
var eating = fruits! //強制的にアンラップして変数eatingに代入
eating.uppercased( ) //変数eatingの中身を大文字にする。変数eatingはString型だからうまくいく。
}
これでも特に問題はないのだが、Swiftではこれをもっと簡単なコードで記述できる。それがオプショナルバインディング(if-let文とも呼ばれる)で以下のように記述される。
var fruits: String? = “orange”
if let eating = fruits {
eating.uppercased( )
}
「let定数名=オプショナルラップされた値」でオプショナルにラップされた値が空かどうかを判断してくれるということだ。
空じゃなかったら{ }の中身の処理が実行され、中身が空(nil)だったら何も処理されない。
ついに
オプショナルまでで基本的な文法が全て終了した。(細かいことを言えばもっとたくさんあるのかもしれないけど。)
長かった。もう脱落している人もいそうだが、俺はなんとかここまできた。
こっからはさらに難しくなるのだが、面白さも倍増するのではないだろうか。あー楽しみ。
頑張ろう!
コメント