
今回はオプショナル(Optional)型について説明したいと思います。
他の言語をある程度学んでる人は理解しやすいと思いますが、Swiftが初めての言語と言う人にとっては、正直とっつきにくいと思います。
完全に理解しようとすると大変なので、最初のうちはこう言う型があるんだなって言う感じで覚えておくと良いと思います。
Swift では空の値(値が無い)、という特殊な値があって、それを nil と呼びます。
他の言語ではNULLと呼んだりします。
オプショナル型とは空の値の状態を保持する事ができる型です。
他の言語では通常の型に「空の値」が入った時はnullと言う値が入ると思いますが、Swiftでは通常の型に「空の値」nilを入れる事ができません。
それは何故かと言うと、他の言語のようにnullを許容してしまうとプログラマーが想定していない箇所で「空の値」が入った時に、予期せぬエラーが出たり、予期せぬ挙動をしたりしてしまう可能性があるからです。
Swiftではオプショナル型を使う事で文法的にエラーを返してくれるので、予期せぬエラーを防ぐ事ができます。
let name: String = "Fu-chan"
print(name)// 結果 Fu-chan
let name2: String = nil //この時点でnilが入ってますよってエラーで教えてくれる。
まずはおさらいです。
1行目と2行目で変数nameに文字列を代入してprintで出力しています。
次は3行目を見てみましょう。
変数name2にnil(空の値)を代入しようとすると、エラーメッセージが出てnil(空の値)を代入できない事を教えてくれます。
もし、nil(空の値)が入る可能性があるなら、オプショナル型で宣言しないといけません!
では変数name2をオプショナル型で宣言してみましょう!
let name2: String? = nil
このように書くだけで変数name2はnil(空の値)を許容する事ができるのでエラーが消えます。
では実際に使う方法をみてみましょう!
オプショナル型を実際に使う時はnil(空の値)かどうかチェックしてから使わないといけません。
チェックの方法は色々あるのですが、まずはif文を使ってチェックしてみます。
let name2: String? = nil
if name2 != nil {
print(name2!)
}
// 結果 nilなので何も起きない
1行目でname2にnil(空の値)を代入しています。
2行目でif文を使いチェックしてるんですけど、
変数name2がnil(空の値)じゃない場合、name2を出力して、nil(空の値)の場合は何もしないと言う処理になります。
ではname2にnil(空の値)じゃなく、普通に文字列を入れてprintしてみます。
let name2: String? = "fu-chan"
if name2 != nil {
print(name2)
}
// 結果 Optional("fu-chan")
5行目の結果を見てみると、Optional(“fu-chan”)と言う結果になっています。
これはオプショナル型の”fu-chan”ですよって言う事なので、オプショナル型から文字列だけを取り出す処理が必要になります。
と言っても簡単で変数name2の後ろに!を付けてあげれば良いです!
このように、オプショナル型から値を取り出す事をアンラップと言います。
let name2: String? = "fu-chan"
if name2 != nil {
print(name2!)
}
// 結果 fu-chan
基本的にはこのオプショナルバインディングで値を取り出す事がほとんどなので、こっちを覚えてしまいましょう!
let name2: String? = "fu-chan"
if let value = name2 {
print(value)
}
// 結果 fu-chan
これはどう言う流れか細かく説明します。
ifは「もし」です
let valueで定数を宣言。
= name2 で定数valueに代入。
これをつなげると、
もし、name2がnil(空の値)じゃなかった場合だけ、name2をアンラップして定数valueに代入しますよ!って言う処理になります。
なので、値を取り出す時は定数valueを使って、アンラップをする必要がありません。
今回はオプショナル型の基本的な事だけを説明しましたが、オプショナル型はもっと奥が深そうですね。
とりあえずは、コードを書いている時に、Optional(“fu-chan”)見たいな値が返ってきた場合は、オプショナルバインディングで値を取り出すんだって感じで覚えておくと良いと思います。
ありがとうございました。
[…] 上記コードを見てみると3行目でFirst Loveの売り上げ枚数を出力しています。出力するには変数名[key]でOKですが、、、ここで4行目の結果を見てみると、なんかOptional(765)と言う結果が表示されています。これは辞書型でキーを指定して呼び出す場合Optional 型で値が返ってくるからです。なので5行目のように!を付けてアンラップして取り出す必要があります。オプショナルについてはこちらの記事が詳しく書いてあるので参考にしてみて下さい。 […]
[…] 1行目ですが、ここで配列staffsをループさせて、staffに代入しています。※for文に関しては[Swift入門#7]for文で繰り返し処理をしてみよう。を参考にしてみて下さい。2行目でas?と言うキーワードを使いstaffをStaff2クラスに変換できるか試しています。as?キーワードでは変換できなかった場合、nilが返ってくるのでOptional Bindingを使ってif let 定数名としています。※Optional Bindingに関しては[Swift入門#12]オプショナル型を使ってみよう。を参考にしてみて下さい。for文の流れとしては、一周目 mayugezioがstaffに代入されます。しかし今回mayugezioはStaffクラスなので何も処理されず終わります。二周目 fuchanがstaffに代入されます。fuchanはStaff2クラスなので2行目で型キャストされて3行目で出力されます。三周目 dmatsuoもfuchanと同じ処理がされます。結果 fuchanとdmatsuoの「nameプロパティ」が出力されます。 […]
[…] この関数ですが、引数にオプショナル型を指定しています。なので、引数を使う時はnilかどうかチェックしてから取り出す必要があります。 このあたりはこちらの[Swift入門#12]オプショナル型を使ってみよう。で説明していますので良かったら読んで見て下さい。このようにオプショナルバインディングでチェックしても良いんですけど、処理が長くなったり複雑化すると、ちょっとわかりづらいと言う難点があるみたいです!そこでよく使われるのが「 early return」又は「early exit 」と言う手法です。 […]
[…] 1行目ですが、ここで配列staffsをループさせて、staffに代入しています。※for文に関しては[Swift入門#7]for文で繰り返し処理をしてみよう。を参考にしてみて下さい。2行目でas?と言うキーワードを使いstaffをStaff2クラスに変換できるか試しています。as?キーワードでは変換できなかった場合、nilが返ってくるのでOptional Bindingを使ってif let 定数名としています。※Optional Bindingに関しては[Swift入門#12]オプショナル型を使ってみよう。を参考にしてみて下さい。for文の流れとしては、一周目 mayugezioがstaffに代入されます。しかし今回mayugezioはStaffクラスなので何も処理されず終わります。二周目 fuchanがstaffに代入されます。fuchanはStaff2クラスなので2行目で型キャストされて3行目で出力されます。三周目 dmatsuoもfuchanと同じ処理がされます。結果 fuchanとdmatsuoの「nameプロパティ」が出力されます。 […]