💡
Optional<Wrapped>型のUnwrap方法
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