本記事ではSwiftのOptional(オプショナル)について、なるべくシンプルに説明していきます。
本記事を読めばSwiftのOptionalの基礎については理解できるようになっています。とりあえず何となく理解したい方は途中まででOKで、余裕があれば最後まで読んでみてください。
記事の想定読者:
・Swiftでよく見る”!“や”?“を何となく使っていて、ちゃんと理解したい方
・Progateなどでプログラミングの基礎を勉強してこれからアプリ開発をやってみたい方など
ソースコードを載せているので、playgroundやXcodeなどで実際に動かしてみてくださいね。
目次
Optional型って何?
Optionalはデータ型の1つです
SwiftのOptionalはOptional型とも言って、データ型の1つです。文字列型(String)や整数型(Int)、真偽値(true,false)などと同じデータ型です。
Optional型は何もないデータを扱えます
じゃあ文字列には文字が入って、整数型には2や3などの数字が入るけど、Optional型には何が入るの?
以下の2つです。
①何もないデータ(nil)
②Optional型の整数や文字列(Optional StringやOptional Int)
では実際にOptional型の使い方を下でみていきます
Optional型[Swift]の使い方:基礎編
上でOptional型には
①何もないデータ(nil)
②Optional型の整数や文字列(Optional StringやOptional Int)
の2つが入ると書きました。1つずつ解説します。
①Optional型は何もないデータ(nil)を扱える
Swiftにはnilと呼ばれる、何もデータがない・空の状態を表すものがあります。
1 2 3 |
var a: Int = 22 var b: Int a = nil |
aは22という数字が入っていたのですが、 a = nilでnilになっていて、bはInt型ってだけで数字が入っていないのでnilです。
で、シンプルに言うと、処理の中でこのnilがあると、エラーが起こります。
プログラムを作っていく中で、nilが絶対に起こらない状況を作るのはなかなか難しいです。というか多分無理です。どっかで値が入ってない何てことは起こってしまいます。
その度にエラーが起こってアプリが落ちてしまうと困りますよね。。
[重要]それを防ぐために使うのがOptional型です。
Optional型はnilをデータとして保管しておけます。nilでもエラーで落ちることはありません!!
1 2 3 4 5 |
var a: Int = 22 var b: Int? a = nil //エラー b = nil //Optional型なのでエラーが起きない。nilになるだけ。 |
Optional型の使い方は?をつけることです。変数bはaと違ってIntの後ろに?がついています。これがOptional型です。今回はIntなので正確にはOptional Intです。
変数aはただInt型なのでnilになるとエラーになります。
が、変数bはOptional Int型なのでエラーが起こりません。
イメージとしては、
もしかしたらデータが入らなくてnilのままになってしまうかも‥
という場合にOptional型を使えばOKと思います。
最初から値が絶対に入ることがわかっているものにOptional型を使う必要はないです。
②Optional型の整数や文字列(Optional StringやOptional Int)
上でOptional型はnilを扱うことができると説明しました。上で既に軽く説明したのですが、Optional型はnilの他にOptional Intといったデータを扱うことができます。Optional Intの他にもOptional Stringなども使えます。
Optional Stringの例をここでは。
1 2 3 4 5 |
var moji: String = "test" //普通のString型 var text: String? = "message" //Optional String moji nil //エラー text = nil //Optional型なのでエラーが起きない。nilになるだけ。 |
Optional型からデータを取り出す”!”
Optional型に保管されているデータはnilかoptional IntやOptional Stringなどが入っていますよね。
そして、Optional型からデータは取り出して使う場面が出てきます。(そもそも使うために保管しているので、使う場面が来るのは当たり前ですね!)
例えば、あるSNSアプリを作っているとして、以下のデータを持っているとします。
ユーザーの最終ログイン時間文字列型(String)や整数型(Int)、真偽値(true,false)などと同じデータ型です。
実際に具体的なアプリを想定しながら考えましょう!
■SNSアプリ
・登録時にユーザー名の登録は必須
・ユーザーの性別については、必須ではない。
この場合、
1 2 |
var userName: String //ユーザー名 String型 var userGender: String? //ユーザーの性別 Optional String型 |
この場合、ユーザー名(userName)は必ず登録されるので、String型で良いですね。
一方でユーザーの性別(userGender)はユーザーが登録するかわかりません。何も登録しなかったことを想定してString?を使ったほうが良さそうですね。
では、
ユーザーが性別を登録していれば、他のユーザーが見れるようにしたいとします。
このOptional型のuserGenderはどのように取り出せるのか。
方法① !を使う(エラーが起こる可能性がある)
!を使えば取り出すことができます。
1 2 3 4 |
var userName: String //ユーザー名 String型 var userGender: String? //ユーザーの性別 Optional String型 var gender = userGender! //String型になる |
下の var genderにuserGender!で取り出しています。
Optional型の後ろに!をつける(アンラップ:unwrap)と、
Optional String型 -> String型
Optional Int型 -> Int型
に変換して取り出せます。
この方法の問題点は、もしOptional型の中身がnilだった場合エラーが起こります。
1 2 3 4 |
var a: Int? a = nil let test = a! //エラー |
変数aにOptional Intで数字が入っていれば、問題なくInt型として取り出せるのですが、nilが入っているとエラーになります。
そこでより安全なOptional型の取り出し方を下に載せます。
方法② if let構文を使う方法(おすすめ&安全&簡単)
if let構文と呼ばれるものを使うと安全にOptional型を取り出すことができます。
安全とはどういうことかというと、
Optional型の値がnilでない場合のみ取り出す。
という方法です。
かなり便利で簡単なので使えるようにしましょう。
書き方は、
if let 〇〇 = Optional型の変数 { }
で、
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var a: Int? var b: Int? a = nil b = 50 if let aTest = a { //aTestにaがnilで無ければ、aの値が入る print(aTest) //この場合aがnilなので、処理されない } if let bTest = b { //bTestにbがnilで無ければ、bの値が入る print(bTest) //bは50なので、50と出力される } |
if let構文を使えば、nilでないかチェックして、もしnilで無ければ取り出すことのできる非常に便利な方法です。
if let構文について少しこちらにも書いているので、参考にしてみてください。
方法③ != nil を使う方法
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var a: Int? var b: Int? a = nil b = 50 if a != nil { print("おはよう") } if b != nil { print("こんにちは") } |
if 〇〇 != nil
この方法もシンプルで良いかと思います。
if let構文はOptional型から取り出した値をすぐに使いたい場合に使う時に便利というイメージで、今回のif 〇〇 != nilはOptional型の〇〇を特に使わない場合に使う感じで良いと思います。(上では、print(“おはよう”)などoptional型の変数aをすぐに使ってないですね。)
まとめ
本記事ではSwiftのOptional型についてまとめてきました。
簡単にいうと、
・Optional型はnilとOptional StringやOptional Stringというデータを扱える
・StringやInt型はnilになるとエラーが起こるので、Optional型wp使おう
・取り出し方には注意が必要(if let構文がおすすめ)
最初Swiftを勉強していると!や?が出てきてなんだこれーー!ってなると思いますが、ちょとずつ慣れていきましょうーー。
参考:
https://techblog.recochoku.jp/5164
https://tea-leaves.jp/swift/content/オプショナル型
https://developer.apple.com/documentation/swift/optional