2016-06-23 8 views
4

私はSwiftを初めて使用していて、Googleからこの回答を見つけることができないので、これはノービスの質問であれば申し訳ありません。ガードとインバートの違いは何か

私が最初にガードを見たとき、私は他のプログラミング言語で逆ifを考えます。

var optString: String? 
guard optString != nil else { return } 
if optString == nil { return } 

2行目と3行目で同じ結果が得られませんか?

私はnilをチェックするよりもコードを簡単にしてアンラッピングすることができますが、guardの目的は何ですか?私が調査したところから、反転したifを入れ替えてifが同じことをすることができると言う人々を見つけることができます。

+1

通常、ガードは関数の先頭に置かれ、コンパイラはelseブランチの関数から戻るように強制するため、入力を検証するための優先メソッドであると言えるでしょう。メソッド本体は入力データの有効性に関係なく実行されます。 –

+0

また、ガードを使用すると、失敗の条件ではなく*成功*の条件をリストして、意図を明確にすることができます。 – Hamish

+0

@TarvoMäeseppそれは逆の 'if'でもできることです。私はこのトリックを行うために他の言語で 'if'を逆に使っていました。 – Joshua

答えて

3

はい、両方の行は機能的に同等であり、同じ結果をもたらします。

guardは、プログラムがelse原因でスコープを終了する必要があるため、より良い方法と考えられます。

これはエラー発生:

guard optString != nil else { // no return statement }

をしかし、これにはない:

if optString == nil { // no return statement }

+1

本当ですか?これはちょうどこれのための新しいキーワードを紹介します!私は人々がチェックのために 'ガード'を使うつもりなら、彼らは何をしているのか知っていなければならず、彼らは返信文を書くでしょう。 – Joshua

+0

あなたの特定のケースでは、その差は小さいです。 'guard let'がオプションをアンラップして、関数呼び出しの*スコープに対してその変数を生き残らせる方法を考慮すると、より多くの違いがあります。 – Connor

6

(そのことについてまたはif letifを反転guard約2つの重要な事がありません持っていない:

  • guardは、returnステートメント、またはガードの親スコープから離れる他の方法(例えば、)を持たなければならないelse句を持つ必要があります。 throwまたはbreak)。
  • guardによって宣言され割り当てられた変数は、guardの親スコープで利用できます。

guardの全体のポイントは、それは、オプションの一部アンラップが成功した場合、コードのみ実行しなければならないので、メソッドの最後まで継続if let体のような面倒な構造を避けるために、あなたにできることです。基本的には、初期の出口を実装するためのよりクリーンな方法です。

だから、あなたの直接的な質問に答えるために、はい guard optString != nil else { return }if optString == nil { return }と同等ですが、それはのために導入されたものではありません guard

Using a guard statement for requirements improves the readability of your code, compared to doing the same check with an if statement. It lets you write the code that’s typically executed without wrapping it in an else block, and it lets you keep the code that handles a violated requirement next to the requirement.

出典:Apple's documentation

0

プログラミング言語では、ほぼ常に1つ以上の方法で処理できます。

しかし、仕事を終わらせることと同じくらい重要なことは、仕事をできるだけ良くすることです。

guardステートメントを使用すると、将来のメンテナーにステートメントの目的を伝えます。

ガード・ステートメントは逆のifステートメントとはまったく同じではありません。

も参照してください:http://ericasadun.com/2015/12/29/migrating-ifs-to-guards-in-swift/

0

アップルのドキュメントによると:「ガード文が1つ以上の条件が満たされない場合スコープの外にプログラム制御を転送するために使用される」

そして、我々だけではなく持っている1 returnキーでスコープから抜け出す可能性を私たちは4つの可能性があります。

  • リターン:
  • ブレークをブロックする/現在の機能を停止:
  • 電流ループを停止します続行:現在のラウンドを停止し、次のラウンドに進みます。
  • throw:現在の機能/ブロックを停止し、エラーをスローします。それはあなたのscopereturnコマンドで停止します原因

あなたの2番目と3番目のラインは、同じ結果を持っています。

関連する問題