0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Swift】オプショナル型のアンラップ! (??、!、guard、guard let、if let の使い方)

Last updated at Posted at 2024-04-02

オプショナル型とは?

  • 値が存在するか、しないか分からない時に使用される型です
  • nilが含まれる可能性のある場合に使用します

使い方

  • 型名の後ろに?をつけることでnilを代入することができる
  • アンラップを行うには??!guardguard let, if letなどを使用します
How to use Optional
let hoge: Int? = nil
var name: String? = "高橋"

オプショナル型をアンラップしましょう

  • 例えば次のコードの場合、nilが含まれている可能性のあるので、コンパイルエラーとなってしまいます
let num: Int? = nil
let num2: Int? = 0

print(num + num2)
// Binary operator '+' cannot be applied to two 'Int?' operands

??とは?

  • 「nil結合演算子」と呼ばれる
  • オプショナル型の変数・定数に値が含まれている場合はその値を返し、nilの場合はデフォルト値を返す演算子

構文

  • デフォルト値にはhogenilだった場合、unwrappedHogeに代入する値を書く
nil coalescing operator Sample
let hoge: Int? = 10
let unwrappedHoge = hoge ?? /* デフォルト値 */

使い方

  • numnilの場合は0が代入されるコード
How to use nil coalescing operator
let num: Int? = 10
let unwrappedName = num ?? 0

!とは?

  • 「強制アンラップ」と呼ばれ、値が存在する、しないに関係なくアンラップを行う
  • オプショナル型変数がnilの場合、強制アンラップを使用するとアプリがクラッシュします
  • 関係なしにアンラップを行うので使うことをおすすめしません

使い方

  • オプショナル型の定数nameを強制アンラップし、出力するコード
  • アンラップしたい定数名の後ろに!をつける
let name: String? = "高橋"
print(name!)
// 出力: 高橋

let hoge: String? = nil
print(hoge!) // `nil`を強制アンラップしたのでクラッシュ!

guardとは?

  • 条件を満たさない場合に処理を早期に終了させる構文です

構文

  • 条件式がfalseになる場合 {} 内のコードが実行されます
guard Sample
guard /* 条件式 */ else {
    // 関数を抜けるコード
    // 例: `return`や`throw`
}

使い方

  • 引数で受け取ったnameの値が「hoge」の場合は早期リターンするコード
How to use guard
func guardSample(name: String) -> String {
    // `name`が「hoge」の場合は早期リターン
    guard name != "hoge" else {
        return "早期リターン"
    }
    
    return "名前は\(name)です!"
}

// nameが「hoge」の場合
print(guardSample(name: "hoge"))
// 出力: 早期リターン

// nameが「高橋」の場合
print(guardSample(name: "高橋"))
// 出力: 名前は高橋です!

guard letとは?

  • Swiftで値が存在することを確認するための構文です
  • オプショナル型の値を安全にアンラップできる!!!

構文

  • 見た目はguardとほとんど同じです
  • 右辺値がnilの場合に{}内のコードを実行します
guard let Sample
guard let /* 定数名 */ = /* オプショナル型の変数・定数 */ else {
    // 関数を抜けるコード
    // 例: `return`や`throw`
}

// guard letでアンラップされた定数(/* 定数名 */)が使用できる

使い方

  • 引数で受け取ったnameがnilの場合、早期リターンを行うコード
How to use guard let
func guardLetSample(name: String?) -> String {
    // 引数nameが`nil`の場合は早期リターン
    guard let unwrappedName = name else {
        return "早期リターン"
    }
    
    // アンラップされた定数`unwrappedName`が使用できる
    return "名前は\(unwrappedName)です!"
}

// nameが`nil`の場合
print(guardLetSample(name: nil))
// 出力: 早期リターン

// nameが「高橋」の場合
print(guardSample(name: "高橋"))
// 出力: 名前は高橋です!

Swift5.7より以下のように省略して書くことができるようになりました

func guardLetSample(name: String?) -> String {
    // `guard let name = name`を省略した形
    guard let name else {
        return "早期リターン"
    }
    
    // アンラップされた定数`name`が使用できる
    return "名前は\(name)です!"
}

if letとは?

  • 右辺値に値が入っているかどうかで条件分岐処理を行うことができる構文
  • オプショナル型の値を安全にアンラップできる!!!

構文

  • 見た目はifと似ています
if let Sample
if let /* 定数名 */ = /* オプショナル型の変数・定数 */ {
    // 右辺値が存在した場合
    // このブロック内で/* 定数名 */を使用することができる
} else {
    // 右辺値が`nil`だった場合
    // /* 定数名 */を使用することはできない!!!
}

使い方

  • 引数nameに値が存在するかどうかで分岐処理を行うコード
How to use if let
func ifLetSample(name: String?) -> String {
    if let unwrappedName = name {
        // 引数nameに値が存在した場合
        // unwrappedNameが使用可能
        return "名前は\(unwrappedName)です!"
    } else {
        return "nameはnilでした!"
    }
}

// nameが`nil`の場合
print(ifLetSample(name: nil))
// 出力: nameはnilでした!

// nameが「高橋」の場合
print(ifLetSample(name: "高橋"))
// 出力: 名前は高橋です!

guard letと同様に省略した書き方ができます

func ifLetSample(name: String?) -> String {
    // `if let name = name {}`を省略した形
    if let name {
        // nameと引数のnameは別物
        // このブロック内のnameはアンラップされたname
        return "名前は\(name)です!"
    } else {
        return "nameはnilでした!"
    }
}

最後に

最後までご覧いただきありがとうございます🙏
意見等ありましたらコメントいただけると幸いです
分からないことだらけなので、勉強の参考にさせてください😢

0
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?