💡

Optional<Wrapped>型のUnwrap方法

2023/02/13に公開約1,500字

Optional型をupwrapする際にいつもこの方法が最適かな…?他にどんなunwrap方法があったっけ…?となるのでOptional型のUnwrap方法をまとめました。

Optional Binding

if-let

let optionalA: String = "a"
if let a = optionalA {
  print(a) // optionalAに値が存在する場合のみ実行される
}

guard-let

let optionalB: String = "b"
guard let b = optionalB else {
  return // optionalBがnilだった場合に実行される処理をここに書く
}
print(b) // optionalBがnilではなく、値が存在していた場合に実行される

Nil Coalescing Operator(??演算子)

??演算子で値がnilだった場合のデフォルト値を設定する。

let optionalInt: Int? = 1
let c = optionalInt ?? 0
print(c) // optionalIntは値1を持っているので「1」が出力される 
let optionalInt: Int? = nil
let d = optionalInt ?? 0
print(d) // optionalIntはnilなのでデフォルト値の「0」が出力される 

Forced Unwrapping

!演算子をつけることで強制的にOptional型をunwrapする。値にnilが入っている場合、実行時にエラーが起きるため、値が絶対入っている場合には使える。

let optionalE: Int? = 1
let optionalF: Int? = 2
print(optionalE! + optionalF!)
let optionalG: Int? = nil
let optionalH: Int? = nil
print(optionalG! + optionalH!) // 「Fatal error: Unexpectedly found nil while unwrapping an Optional value」というエラーが実行時に起きる

Optional Chaining

Optional<Wrapped>型の式の後に「?」に続けてWrapped型のプロパティやメソッドを記述することで、値がnilでなかった場合、unwrapを伴わずにWrapped型のメンバーにアクセスできる。もし値がnilだった場合、「?」以降に記載されているプロパティやメソッドへはアクセスせずにnilを返却する。

struct Address {
  var city : String
}

struct Person {
  var name : String?
  var address: Address?
}

var girl = Person()
girl.name = "Abby"

if girl.address?.city == "Orlando" {
  print( "Abby lives in Orlando." )
} else {
  print( "Abby lives somewhere else." ) // girl.address?.cityはnilなのでここの処理が実行される
}

Discussion

ログインするとコメントできます