回答:
assert
テスト中の健全性チェック用precondition
ですが、発生した場合にプログラムが合理的に続行できないことを防ぐためのものです。
したがって、たとえば、assert
バグがあるかどうかをすばやく見つけるために、(たとえば、ある範囲内で)賢明な結果を持ついくつかの計算を行うことができます。ただし、範囲外の結果は有効であり、重要ではないため、アプリをクラッシュさせないようにする必要があります(進行状況バーに進行状況を表示するためだけに使用していると想定してください)。
一方、要素をフェッチするときに、アレイ上の添字が有効であることを確認することですprecondition
。オプションではない値を返す必要があるため、無効な添え字を要求されたときに配列オブジェクトが取る次の適切なアクションはありません。
ドキュメントからの全文(オプションをクリックassert
しprecondition
てXcodeで試してください):
前提条件
前進するために必要な条件を確認してください。
この関数を使用して、出荷コードでもプログラムが続行できない状態を検出します。
プレイグラウンドおよび-Ononeビルド(Xcodeのデバッグ構成のデフォルト):
condition
評価がfalseの場合、印刷後にデバッグ可能な状態でプログラムの実行を停止しますmessage
。-Oビルド(Xcodeのリリース構成のデフォルト):
condition
評価がfalseの場合、プログラムの実行を停止します。-チェック
condition
されていないビルドでは、評価されませんが、オプティマイザはに評価されると想定する場合がありtrue
ます。-チェックされていないビルドでその前提を満たさないことは、重大なプログラミングエラーです。
主張する
従来のCスタイルのアサートとオプションのメッセージ。
この関数は、テスト中にアクティブであるが出荷コードのパフォーマンスに影響を与えない内部健全性チェックに使用します。リリースビルドでの無効な使用をチェックするには、参照してください
precondition
。
プレイグラウンドおよび-Ononeビルド(Xcodeのデバッグ構成のデフォルト):
condition
評価がfalseの場合、印刷後にデバッグ可能な状態でプログラムの実行を停止しますmessage
。-Oビルド(Xcodeのリリース構成のデフォルト)では、
condition
評価されず、影響はありません。-チェック
condition
されていないビルドでは、評価されませんが、オプティマイザはに評価されると想定する場合がありtrue
ます。-チェックされていないビルドでその前提を満たさないことは、重大なプログラミングエラーです。
data["name"]
存在しない場所でJSONを読み取るガードステートメントを想像してみてください。guard..else {}内にアサートがあると、クラッシュして問題が発生するため、エラーを見つけるのに役立ちます。同様に、このコードが本番環境にある場合、アサートによってプログラムがクラッシュすることはなく、私が使用したバックアップコード(return nil
)が引き継ぐことになります。
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と最適化レベルを参照してください。
precondition()
とpreconditionFailure()
されている同じ行動を持ちます。これらの関数の違いは次のとおりprecondition
ですpreconditionFailure
。ただ捨てるだけで内部に条件が必要です。
precondition
アプリを出荷するときにそのリリースモードでアクティブであり、前提条件は、アプリが終了します失敗しました。
Assert
デフォルトではデバッグモードでのみ動作します。
NSHipsterで使用する場合、この素晴らしい説明が見つかりました。
アサーションは、古典的な論理から借用した概念です。論理的には、アサーションは証明内の命題に関するステートメントです。プログラミングでは、アサーションは、宣言された場所でプログラマがアプリケーションについて行った仮定を示します。
メソッドまたは関数の実行の開始時と終了時のコードの状態に関する期待を記述する前提条件と事後条件の能力で使用される場合、アサーションは契約を形成します。特定の前提条件が失敗したときに実行を防ぐために、アサーションを使用して実行時に条件を適用することもできます。
前提条件
func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
前進するために必要な条件を確認してください。
主張する
func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
従来のCスタイルのアサートとオプションのメッセージ。
この関数は、テスト中にアクティブであるが出荷コードのパフォーマンスに影響を与えない内部健全性チェックに使用します。リリースビルドでの無効な使用をチェックするには、前提条件を参照してください。
プレイグラウンドおよび-Ononeビルド(Xcodeのデバッグ構成のデフォルト):条件がfalseと評価された場合、メッセージの出力後にデバッグ可能な状態でプログラムの実行を停止します。