おーしまブログ

プログラミングやってます

【swift】オプショナル型の使い方

こんにちは、おーしまです。

今回はオプショナル型について解説していきます。


オプショナル型とは、
データ型の1つで、初期の値はなく、これから値が入ることを宣言するプロパティのことです。最大の特徴はnilを許容できる事で、オプショナル型以外はnilが代入されるとエラーになってしまいます。


書き方例

var hoge: String?
var hoge1: String!

の2種類になります。
!も?も初期値には、nilが代入されます。



非オプショナル型書き方例

var hoge: String = "こんにちは"

オプショナル型以外は、nilが入ることが許されないので上記のように、nil以外の値を代入する必要があります。




どんな時に使用するかというと、例えばTwitterプロフィール画像のように設定する人もいれば、設定しない人もいる、つまり、値が入る時と値が入らない時のパターンが存在する時に使用します。設定しない人はnilとできるからです。

var profileImage: UIImage?
profileImage = UIImage(named: "aaaa")   // "aaaa"を設定


アンラップ方法

アンラップとは、例えば、オプショナル型で10を代入しても、非オプショナル型と同じ10にならないため、計算などができません。よって、オプショナル型の10と非オプショナル型の10を計算できるように変換することを言います。元々、オプショナル型は値が入っているのか、入っていないのか不確定なので、値が入っていることを確認するためにアンラップをしてあげる必要がるのです。アンラップをしてあげることで10という値が認識されます。

var num1: Int = 10           // 非オプショナル型
var num2: Int? = 10         // オプショナル型

print(num1)               // => 10
print(num2)              // => Optional(10)   (10にならない)

num1 + num2      // エラー
  • 方法1:強制アンラップ
var hoge: String?

hoge = "こんにちは"

print(hoge!)     // 「!」をつけるだけ

=> こんにちは

変数の後ろに「!」をつけます。
しかし、強制アンラップでは、値が代入されておらず、nilだった場合、エラーが起きます。


  • 方法2:if let
var hoge: String?

if let hogehoge = hoge {
    print(hogehoge)
}

print("動作完了")

=> 動作完了

上記のように、hogeの値がnilの時はif letの中身の処理は行いません。

var hoge: String?

hoge = "こんにちは"

if let hogehoge = hoge {
    print(hogehoge)
}

print("動作完了")

=> こんにちは
=> 動作完了

上記のように、hogeに「こんにちは」が代入されていると、hogehogeに「こんにちは」を代入して、if letの中身の処理を行います。



  • 方法3:guard let
var hoge: String?

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let hogehoge = hoge else { return }
        print(hogehoge)

    }
}

let vc = ViewController()
vc.viewDidLoad()

print("動作完了")


=> 動作完了

guard let はクラスを使います。guard let は if let と反対の効果があって、値がnilの場合にguard letの中の処理を行います。上記では、hogenilのためreturnの処理が走っています。


  • 方法4:オプショナルチェインニング
var hoge: String?

print("hogeのcount:", hoge?.count)     // 「?」をつける

=> hogeのcount:nil

強制アンラップと違い、「?」をつけます。値がnilだった場合でも、エラーは起こらず、「hoge?」の後の処理は実行されずに、nilとなります。





基本的に、

  • if let
  • guard let

の方が安全に使えるので、その2つがおすすめです。


今回はここまでです。
お疲れ様でした。

ここはどこ おれはだれ それに近いものがあんだよ 始めようとした奴らも迷い始めてる 怖がらせないでよ そりゃ甘くはないけど まだまだ 夢見ていい世界なんでしょ {UVERwould「ハイ!問題作」}