1. ホーム
  2. swift

[解決済み] swiftにおける "precondition "と "assert "の違いとは?

2022-05-16 10:44:10

質問

とはどう違うのでしょうか? precondition(condition: Bool, message: String)assert(condition: Bool, message: String) をSwiftで使うのですか?

どちらも私には同じに見えます。どのようなコンテキストで、我々は他の上に1を使用する必要がありますか?

どのように解決するのですか?

assert はテスト時のサニティチェックのためであるのに対し precondition は、もしそれが起こった場合、プログラムが合理的に進行できないことを意味するものから保護するためのものです。

ですから、例えば assert を付けて、バグがあるかどうかすぐに分かるようにすることができます。 しかし、境界外の結果である は有効であり、クリティカルではないので、アプリをクラッシュさせるべきではありません (プログレス バーの進捗状況を表示するためだけに使用したと仮定します)。

一方、要素を取得するときに配列の添え字が有効であるかどうかをチェックするのは precondition . であるため、無効な添え字を求められたときに配列オブジェクトが取るべき妥当な次の動作はありません。 は非選択的な値を返さなければならないからです。

ドキュメントからの全文 (オプションクリックを試す assertprecondition を Xcode で使用)。

前提条件

前進するための必要条件を確認する。

この関数は、出荷コードであってもプログラムの進行を妨げなければならない条件を検出するために使用します。 この機能を使って、出荷コードであってもプログラムの進行を妨げるべき条件を検出します。

  • プレイグラウンドと -Onone ビルド (Xcode の Debug 構成のデフォルト) では、次のようになります。 設定のデフォルト): もし condition が false と評価された場合、印刷後にデバッグ可能な状態でプログラムの実行を停止します。 を表示した後、デバッグ可能な状態でプログラムの実行を停止します。 message .

  • Oビルド(XcodeのRelease設定のデフォルト)で。 もし condition が false と評価された場合、プログラムの実行を停止します。

  • -Ouncheckedビルドにおいて。 condition は評価されませんが、オプティマイザは オプティマイザは と評価します。 true . 失敗 のビルドでこの仮定を満たさないことは,重大なプログラミングエラーです。 プログラミングのエラーです。

アサート

伝統的なC言語スタイルのアサートで、オプションでメッセージを指定できます。

この関数は、テスト中に有効だが出荷コードの性能に影響を与えない内部サニティチェックのために使用します。 この関数は、テスト中に有効であるが、出荷コードの性能には影響を与えない内部サニティチェックに使用します。 リリースビルドでの無効な使用法をチェックするためには precondition .

  • プレイグラウンドと -Onone ビルド (Xcode の Debug 構成のデフォルト) では、次のようになります。 設定のデフォルト): もし condition が false と評価された場合、印刷後にデバッグ可能な状態でプログラムの実行を停止します。 を表示した後、デバッグ可能な状態でプログラムの実行を停止します。 message .

  • O ビルド(Xcode の Release 構成のデフォルト)で。 condition は評価されないので、何の効果もありません。

  • -Ounchecked ビルドにおいて。 condition は評価されませんが、オプティマイザは オプティマイザは と評価します。 true . 失敗 のビルドでこの仮定を満たさないことは,重大なプログラミングエラーです。 プログラミングのエラーです。