kazuki’s blog

新人エンジニアのブログ

Swiftの!と?の違いと使い方

初めまして! かずきです。

この頃Unityばかり触っているので、Swiftを忘れかけている。。。 という事でSwift入門者向けの記事を何回に分けて書いていこうと思います!

オプショナル型とは

オプショナル型は変数宣言時にデータ型名の後ろに?をつけることで利用出来るnil許容型です。

var hoge : Int?
var hogehoge : int!

!については後ほど説明致します。

オプショナル型のアンラップ

そのままオプショナル型の変数を利用しようとするとOptional()に囲まれた状態で中に入った値を利用できません。

var hoge : Int? = 114514
print(hoge)
// => Optional(114514)

強制アンラップ

名前の通り強制的にオプショナル型をアンラップする方法です。 オプショナル型変数の値がnilの場合エラーが発生します。

var hogehoge : String? = nil
print(hogehoge!)
// エラー

hogehoge = "屋上あんだけど焼いてかない?"
print(hogehoge!)
// => 屋上あんだけど焼いてかない?

nilを許容しない場面でアンラップする際に使用します。

オプショナルバインディング

オプショナルバインディングは、if文などの条件式として利用します。
オプショナル型変数の値がnil以外場合、条件式左辺で宣言した変数にアンラップされた値が代入されます。

if let unwrapfuga = fuga {
    // fugaが`nil以外`の場合(アンラップされた値がunwrapfugaに代入されている)
}
else {
   // fugaがnilの場合(unwrapfugaは利用不可)
}

nilを許容する場面で、変数の値がnilでない場合のみ処理を行いたい場合などに使用します。

オプショナルチェイニング

オプショナル型変数に含まれるメソッドやプロパティを利用する際に使用します。
オプショナルチェイニングを使用してメソッドやプロパティにアクセスした場合、戻り値は全てオプショナル型となります。

※例えばこのようなクラスがあったとします。

class HogeHoge{

    private var name : String = "yajuu"
    public var Name : String {
        get {
            return self.name
        }
    }
    
    public func IceTea() -> String
    {
        return "おまたせ!アイスティーしかなかったけどいいかな?"
    }
}

変数hogehgeに値が入っている場合はオプショナル型の戻り値が帰ってきます。

var hogehoge : HogeHoge? = HogeHoge()
print(hogehoge?.Name)
// => Optional("yajuu")
print(hogehoge?.IceTea())
// => Optional("おまたせ!アイスティーしかなかったけどいいかな?")

変数hogehogeがnilの場合は戻り値もnilになります。

var hogehoge : HogeHoge? = nil
print(hogehoge?.Name)
// => nil
print(hogehoge?.IceTea())
// => nil

戻り値を強制アンラップオプショナルバインディングして使用します。

暗黙的アンラップ型

暗黙的アンラップ型はオプショナル型の一種で、使用時に自動で強制アンラップを行います。

// オプショナル型
var a : Int? = 10
var b : Int = 20
var c = a! + b
// cc = 30

var a : Int? = 10
var b : Int = 20
var c = a + b
// エラー

// 暗黙的アンラップ型
var aa : Int! = 10
var bb : Int = 20
var cc = aa + bb
// 自動的に強制アンラップされるので、ccは30になる

主に初期化時以外でのnilが許容されない場面で使用します。

まとめ

  • オプショナル型?nilを許容する場合、!は初期化時のみnilを許容する場合に使用する
  • 強制アンラップ!はオプショナル型?でもnilを許容しない場面で使用する
  • オプショナルバインディングnilでない場合とnilの処理を分ける為に使用する
  • オプショナルチェイニングは戻り値がオプショナル型になる為、強制アンラップ オプショナルバインディングを使用してアンラップする
  • オプショナル型!暗黙的アンラップと言い、使用時に自動的に強制アンラップされる