Skip to content

Instantly share code, notes, and snippets.

@koher
Created June 1, 2020 15:28
Show Gist options
  • Save koher/71d5c2d4cc097401dbd131a63262412c to your computer and use it in GitHub Desktop.
Save koher/71d5c2d4cc097401dbd131a63262412c to your computer and use it in GitHub Desktop.
// もし if let が存在しなかったら・・・
let a: Int? = Int("...")
if a != nil {
// ここでは a は nil ではないとわかっているけど、
// a の型は Int? なので↓のような計算はできない。
print(a * 2) // コンパイルエラー
// a は nil でないとわかっているのに、↓のように
// forced unwrapping (!) してから使わないといけない。
// ! は失敗するとクラッシュするので、
// この行単独で見たときに本当に安全かわからない。
// ここに至るまでのコードを読まないと安全か確信できない。
print(a! * 2) // これはできる
}
// if let が使える場合
let a: Int? = Int("...")
// a が nil でない場合だけ unwrap された値を b に代入して
// { } の中を実行する。 b の型は Int? ではなく Int になる。
if let b = a {
// b は Int? ではなく Int 型なので↓のように計算できる。
// ! で unwrap する必要はない。
print(b * 2) // OK
}
// if let は↓の代わりの便利なものと考えられる。
let a: Int? = Int("...")
if a != nil {
// ここでは a が nil でないことがわかっている。
// a が nil でないかチェックしたということは、
// ここで a に wrap された値を使いたいということ。
// 当然、↓のように unwrap して値を取り出したい。
let b: Int = a!
// そして、取り出した値を使う。
print(b * 2)
}
// この、 if a != nil と let b: Int = a! を
// まとめてやってくれるのが if let b = a 。
// a != nil をチェックするときは a に wrap された値を
// 使いたいはずなんだから、チェックと unwrap をまとめて
// やってくれる構文があるといいよね、というのは自然な発想。
// そうして生まれたのが if let 。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment