この記事を読んで、Guardを使用する大きなメリットに気づきました
ここでは、ガードの使用と例を比較できます。
これはガードのない部分です:
func fooBinding(x: Int?) {
if let x = x where x > 0 {
// Do stuff with x
x.description
}
// Value requirements not met, do something
}
ここでは、すべての条件内で目的のコードを配置しています
これですぐに問題が発生するわけではないかもしれませんが、ステートメントを実行する前にすべての条件を満たす必要がある多数の条件がネストされていると、混乱する可能性があることを想像できます。
これをクリーンアップする方法は、最初に各チェックを実行し、満たされていない場合は終了することです。これにより、この関数を終了させる条件を簡単に理解できます。
しかし、これでガードを使用できるようになり、いくつかの問題を解決できることがわかります。
func fooGuard(x: Int?) {
guard let x = x where x > 0 else {
// Value requirements not met, do something
return
}
// Do stuff with x
x.description
}
- 望まない状態ではなく、望む状態をチェックします。これもアサートに似ています。条件が満たされない場合は、guardのelseステートメントが実行され、関数から抜け出します。
- 条件が満たされると、ここでのオプション変数は、guardステートメントが呼び出されたスコープ内で自動的にアンラップされます。この場合は、fooGuard(_ :)関数です。
- 悪いケースを早期にチェックして、関数を読みやすくし、維持しやすくする
この同じパターンは、オプションではない値にも当てはまります。
func fooNonOptionalGood(x: Int) {
guard x > 0 else {
// Value requirements not met, do something
return
}
// Do stuff with x
}
func fooNonOptionalBad(x: Int) {
if x <= 0 {
// Value requirements not met, do something
return
}
// Do stuff with x
}
それでも質問がある場合は、記事全体を読むことができます:Swiftガードステートメント。
まとめ
そして最後に、読んでテストしたところ、オプションをアンラップするためにガードを使用すると、
これらのラップされていない値は、残りのコードブロックで使用するために残ります
。
guard let unwrappedName = userName else {
return
}
print("Your username is \(unwrappedName)")
ここで、ラップされていない値はifブロック内でのみ利用可能です。
if let unwrappedName = userName {
print("Your username is \(unwrappedName)")
} else {
return
}
// this won't work – unwrappedName doesn't exist here!
print("Your username is \(unwrappedName)")