Swift 2ではguard
キーワードが導入され、さまざまなデータが準備完了していることを確認できるようになりました。私が見た例ではこのウェブサイトsubmitTapped 関数の例を示します。
func submitTapped() {
guard username.text.characters.count > 0 else {
return
}
print("All good")
}
guard
を使用することは、条件を使用する従来の方法と何か違うのだろうかと思っていますif
。単純なチェックでは得られないメリットが得られるのでしょうか?
ベストアンサー1
読むこの記事私は大きなメリットを感じましたガード
ここで、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
}
- 必要な条件をチェックし、不要な条件はチェックしません。これも assert に似ています。条件が満たされない場合は、guard の else ステートメントが実行され、関数から抜け出します。
- 条件が満たされると、ここでのオプション変数は、ガード ステートメントが呼び出されたスコープ内 (この場合は 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
}
まだ質問がある場合は、記事全体をお読みください。迅速なガード声明。
まとめ
そして最後に、読んでテストした結果、ガードを使ってオプショナルをアンラップすると、
ラップされていない値は、コードブロックの残りの部分で使用できるように残ります。
。
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)")