15
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Swift】Optional Value が nil の場合の処理方法

Posted at

はじめに

オプショナルバリューがnilの場合の処理方法をまとめる

オプショナルバリューとは

オプショナルバリューとは、nilの可能性がある値のこと
Optional()でラップされているのでこのまま値を使えません
そこで、 nilかどうかを判別して処理を分岐させる必要があります

初期値の設定 ??

オプショナルバリュー ?? 初期値
の形で記述すると、オプショナルバリューがnilの場合、初期値を使用することになります

var count:Int?
var price:Int

// countはnilなので、初期値5で計算する
price = 250 * (count ?? 5)
print("\(price)円です")

// 1250円です

// countがnilでなく3なので、3で計算する
count = 3
price = 250 * (count ?? 5)
print("\(price)円です")

// 750円です

Opitional Binding

オプショナルバインディングは、オプショナルバリューがnilでなければ
値をアンラップして一時変数に代入し、nilの場合はfalseを返す機能です
この機能はif文while文guard-else文で利用できます

  • if文

var str:String?
str = "Swift"

if let msg = str {
    // strがnilでない処理
    print("\(msg)ワールド")
} else {
    // strがnilの時の処理
    print("ハローワールド")
}

  • for-in文と組み合わせて

var sum = 0
let dic:[String:Int?] = ["a":23, "b":nil, "c":10, "d":nil]

for (_, value) in dic { // for-inで辞書型を取り出した場合タプルで取得される keyは使わないので捨てる
    if let num = value {
        sum += num // dicから取り出したvalueがnilでない時だけ実行される
    }
}
print("数値の合計は\(sum)")
  • while文

var str:String? = "☆★"
var repeatString:String = ""
var i = 0

// strがnilでない時、アンラップしてstampに代入します nilならwhileループを実行しません
while let stamp = str {
  repeatString += stamp
  i += 1
  if (i > 10) {
    break
  }
}
print(repeatString)
  • guard-else文

guard-else文でオプショナルバインディングを利用することで、オプショナルバリューがnilの場合に処理を中断し、
nilでない場合は値をアンラップして変数/定数に代入しそのまま利用していくことができます
if文と異なるのは、if文ではアンラップした値を代入した変数/定数はif文のブロック内でだけ有効なローカル変数という点です


let who = "桜"
var level:Int?

func hello() {
    // levelをtheLevelにオプショナルバインディングする
    guard let theLevel = level else {
        return // theLevelがnilの時は処理を中断する
    }

    if theLevel < 10 {
        print("hello\(who)隊員")
    } else {
        print("hello\(who)上級隊員")
    }
}

// level未設定
hello()  // 処理が中断される
// level設定
level = 9
hello()

// hello桜上級隊員

Optional Chain

オプショナルチェーンとは、オブジェクトや配列などの値にドットシンタックスでアクセスする時に
対象に?を付けることで、値がnilだった場合に実行時エラーを回避する記述方法です


// ballsは配列で、タプルの値を持つ
// ballsが空のとき
// 配列操作 [Array.first] で最初の値にアクセスできる
var balls:[ (size:Int, color:String) ] = []
var ballsize = balls.first?.size  // 値がないのでnilです ここで処理が中断してballsizeにnilが代入されます
print(ballsize)

// ballsに値があるとき
balls = [ (size:2, color:"red" ), (size:4, color:"green") ]
ballsize = balls.first?.size
print(ballsize)

参考

詳細!Swift 4 iPhoneアプリ開発 入門ノート Swift 4+Xcode 9対応

15
15
0

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
15
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?