「前提条件」と「アサート」の違いは迅速ですか?


105

違いは何だprecondition(condition: Bool, message: String)assert(condition: Bool, message: String)スウィフトでは?

どちらも同じように見えます。どのコンテキストでどちらを使用する必要がありますか?

回答:


125

assertテスト中の健全性チェック用preconditionですが、発生した場合にプログラムが合理的に続行できないことを防ぐためのものです。

したがって、たとえば、assertバグがあるかどうかをすばやく見つけるために、(たとえば、ある範囲内で)賢明な結果を持ついくつかの計算を行うことができます。ただし、範囲外の結果有効であり、重要ではないため、アプリをクラッシュさせないようにする必要があります(進行状況バーに進行状況を表示するためだけに使用していると想定してください)。

一方、要素をフェッチするときに、アレイ上の添字が有効であることを確認することですprecondition。オプションではない値を返す必要があるため、無効な添え字を要求されたときに配列オブジェクトが取る次の適切なアクションはありません

ドキュメントからの全文(オプションをクリックassertpreconditionてXcodeで試してください):

前提条件

前進するために必要な条件を確認してください。

この関数を使用して、出荷コードでもプログラムが続行できない状態を検出します。

  • プレイグラウンドおよび-Ononeビルド(Xcodeのデバッグ構成のデフォルト):condition評価がfalseの場合、印刷後にデバッグ可能な状態でプログラムの実行を停止しますmessage

  • -Oビルド(Xcodeのリリース構成のデフォルト):condition評価がfalseの場合、プログラムの実行を停止します。

  • -チェックconditionされていないビルドでは、評価されませんが、オプティマイザはに評価されると想定する場合がありtrueます。-チェックされていないビルドでその前提を満たさないことは、重大なプログラミングエラーです。

主張する

従来のCスタイルのアサートとオプションのメッセージ。

この関数は、テスト中にアクティブであるが出荷コードのパフォーマンスに影響を与えない内部健全性チェックに使用します。リリースビルドでの無効な使用をチェックするには、参照してくださいprecondition

  • プレイグラウンドおよび-Ononeビルド(Xcodeのデバッグ構成のデフォルト):condition評価がfalseの場合、印刷後にデバッグ可能な状態でプログラムの実行を停止しますmessage

  • -Oビルド(Xcodeのリリース構成のデフォルト)では、 condition評価されず、影響はありません。

  • -チェックconditionされていないビルドでは、評価されませんが、オプティマイザはに評価されると想定する場合がありtrueます。-チェックされていないビルドでその前提を満たさないことは、重大なプログラミングエラーです。


2
「しかし、範囲外の結果有効である可能性があり、重要ではないため、アプリをクラッシュさせてはならないので、それを同梱することは望まないでしょう」と私にはあいまいです。親切にあなたは正確な例を含めることができますか?おそらくいくつかのコード。
ハニー

2
あなたの質問に答えて、私は個人的にアサートを使用して、ビルドしてそれをテストしている間、ビルドで発生してはならないことをキャッチします。data["name"]存在しない場所でJSONを読み取るガードステートメントを想像してみてください。guard..else {}内にアサートがあると、クラッシュして問題が発生するため、エラーを見つけるのに役立ちます。同様に、このコードが本番環境にある場合、アサートによってプログラムがクラッシュすることはなく、私が使用したバックアップコード(return nil)が引き継ぐことになります。
Alec O

1
アプリ全体をクラッシュさせるのではなく、インデックスをチェックして何もしませんか?
ユリアンオノフレ

はい、インデックスをチェックする必要がありますが、誰もが時々失敗します。アサートを使用すると、忘れたときにインデックスをチェックする必要があったことを理解するのに役立ちます。
Victor Engel

90

Swiftアサート-不足しているマニュアルが役立つことを発見しました

                        debug   release   release
function                -Onone  -O       -Ounchecked
assert()                YES     NO        NO
assertionFailure()      YES     NO        NO**
precondition()          YES     YES       NO
preconditionFailure()   YES     YES       YES**
fatalError()*           YES     YES       YES

そして、Swift Evolutionに関する興味深い議論から

–アサート:独自のコードで内部エラーをチェックする

–前提条件:クライアントが有効な引数を提供したことを確認するため。

また、何を使用するかに注意する必要があります。assertionFailureと最適化レベルを参照してください。


自分のコードとクライアントの違いについて詳しく説明できますか?クライアントについては、文字列が期待される場所に数値を挿入するような意味ですか?それはいくつかの単純なエラー処理で扱われるべきではありませんか?
ハニー

@ハニー私は彼がネットワークAPI呼び出し、またはクライアント自身のプラグインからの引数/結果について意味すると思います。
Chen Li Yong

クライアントはあなたのコードを使用している誰かです、あなたがライブラリを書いていて、プログラマが無効なデータを渡したとしましょう。深刻なプログラミングエラーと見なされる可能性があるため、正常に続行する必要はありません。ユーザーにとって非常に役に立たないため、無効なネットワークAPIデータでクラッシュすることはおそらくないでしょう。
bompf

@ onmyway133:Xcodeのクイックヘルプから、私が考えるprecondition()preconditionFailure()されている同じ行動を持ちます。これらの関数の違いは次のとおりpreconditionですpreconditionFailure。ただ捨てるだけで内部に条件が必要です。
nahung89

12

preconditionアプリを出荷するときにそのリリースモードでアクティブであり、前提条件は、アプリが終了します失敗しました。 Assertデフォルトではデバッグモードでのみ動作します。

NSHipsterで使用する場合、この素晴らしい説明が見つかりました。

アサーションは、古典的な論理から借用した概念です。論理的には、アサーションは証明内の命題に関するステートメントです。プログラミングでは、アサーションは、宣言された場所でプログラマがアプリケーションについて行った仮定を示します。

メソッドまたは関数の実行の開始時と終了時のコードの状態に関する期待を記述する前提条件と事後条件の能力で使用される場合、アサーションは契約を形成します。特定の前提条件が失敗したときに実行を防ぐために、アサーションを使用して実行時に条件を適用することもできます。


アサーションは、コンパイラフラグを使用して有効または無効にできます。出荷されたコードでアクティブにすることができます。
PéturIngi Egilsson

6

前提条件

func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)

前進するために必要な条件を確認してください。

  1. この関数を使用して、出荷コードでもプログラムが続行できない状態を検出します。
  2. プレイグラウンドおよび-Ononeビルド(Xcodeのデバッグ構成のデフォルト):条件がfalseと評価された場合、メッセージの出力後にデバッグ可能な状態でプログラムの実行を停止します。
  3. -Oビルド(Xcodeのリリース構成のデフォルト):条件がfalseと評価された場合、プログラムの実行を停止します。
  4. -チェックされていないビルドでは、条件は評価されませんが、オプティマイザは条件が真であると評価する場合があります。-チェックされていないビルドでその前提を満たさないことは、重大なプログラミングエラーです。

主張する

func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)

従来のCスタイルのアサートとオプションのメッセージ。

  1. この関数は、テスト中にアクティブであるが出荷コードのパフォーマンスに影響を与えない内部健全性チェックに使用します。リリースビルドでの無効な使用をチェックするには、前提条件を参照してください。

  2. プレイグラウンドおよび-Ononeビルド(Xcodeのデバッグ構成のデフォルト):条件がfalseと評価された場合、メッセージの出力後にデバッグ可能な状態でプログラムの実行を停止します。

  3. -Oビルド(Xcodeのリリース構成のデフォルト)では、条件は評価されず、影響はありません
  4. -チェックされていないビルドでは、条件は評価されませんが、オプティマイザは条件が真であると評価する場合があります。-チェックされていないビルドでその仮定を満たさないことは、深刻なプログラミングエラーです
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.