Created
June 1, 2020 15:28
-
-
Save koher/71d5c2d4cc097401dbd131a63262412c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// もし 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