Was ist der Unterschied zwischen precondition(condition: Bool, message: String)
und assert(condition: Bool, message: String)
in Swift?
Beide sehen für mich gleich aus. In welchem Kontext sollten wir einen über den anderen verwenden?
assert
dient zur Überprüfung der geistigen Gesundheit während des Testens, während precondition
es zum Schutz vor Dingen dient, die bedeuten würden, dass Ihr Programm in diesem Fall nicht angemessen fortgesetzt werden kann.
So können Sie beispielsweise eine assert
Berechnung mit vernünftigen Ergebnissen durchführen ( z. B. innerhalb einiger Grenzen), um schnell festzustellen, ob Sie einen Fehler haben. Aber Sie möchten damit nicht versenden, da das Out-of-Bound-Ergebnis möglicherweise gültig und nicht kritisch ist und Ihre App nicht abstürzen sollte (nehmen Sie an, Sie haben es nur verwendet, um den Fortschritt in einem Fortschrittsbalken anzuzeigen).
Wenn Sie jedoch überprüfen, ob ein Index in einem Array gültig ist, wenn Sie ein Element abrufen, ist dies a precondition
. Es gibt keine vernünftige nächste Aktion für das Array - Objekt zu nehmen , wenn für einen ungültigen Index gefragt, denn es muss einen nicht-optionalen Wert zurück.
Volltext aus den Dokumenten (versuchen Sie es mit einem Optionsklick assert
und precondition
in Xcode):
Voraussetzung
Überprüfen Sie eine notwendige Bedingung, um Fortschritte zu erzielen.
Verwenden Sie diese Funktion, um Bedingungen zu erkennen, die verhindern müssen, dass das Programm auch im Versandcode fortgesetzt wird.
In Spielplätzen und -Onone-Builds (die Standardeinstellung für die Debug-Konfiguration von Xcode): Wenn
condition
sie als falsch ausgewertet wird, stoppen Sie die Programmausführung nach dem Drucken in einem debuggbaren Zustandmessage
.In -O-Builds (Standardeinstellung für die Release-Konfiguration von Xcode): Wenn der
condition
Wert false ist, beenden Sie die Programmausführung.In -Ounchecked baut,
condition
wird nicht ausgewertet, aber der Optimierer annehmen kann , dass es würde zu bewertentrue
. Die Nichterfüllung dieser Annahme in -Ounchecked Builds ist ein schwerwiegender Programmierfehler.
Behaupten
Traditionelle Bestätigung im C-Stil mit einer optionalen Nachricht.
Verwenden Sie diese Funktion für interne Sicherheitsüberprüfungen, die während des Tests aktiv sind, jedoch die Leistung des Versandcodes nicht beeinträchtigen. So überprüfen Sie, ob die Verwendung in Release-Builds ungültig ist; siehe
precondition
.
In Spielplätzen und -Onone-Builds (die Standardeinstellung für die Debug-Konfiguration von Xcode): Wenn
condition
sie als falsch ausgewertet wird, stoppen Sie die Programmausführung nach dem Drucken in einem debuggbaren Zustandmessage
.In -O-Builds (die Standardeinstellung für die Release-Konfiguration von Xcode)
condition
wird nicht ausgewertet und es gibt keine Auswirkungen.In -Ounchecked baut,
condition
wird nicht ausgewertet, aber der Optimierer annehmen kann , dass es würde zu bewertentrue
. Die Nichterfüllung dieser Annahme in -Ounchecked Builds ist ein schwerwiegender Programmierfehler.
data["name"]
sie nicht existiert, aber sollte. Eine Behauptung innerhalb der Wache zu haben ... sonst {} würde mir helfen, meinen Fehler zu erkennen, indem ich abstürze und mich zum Problem bringe. Wenn dieser Code in Produktion wäre, würde die Zusicherung das Programm nicht zum Absturz bringen, und der von mir verwendete Sicherungscode (return nil
) würde ebenfalls übernehmen.Ich fand Swift Asserts - das fehlende Handbuch hilfreich
Und aus interessanten Diskussionen über Swift Evolution
Außerdem müssen Sie bei der Verwendung vorsichtig sein, siehe assertionFailure und Optimization Level
quelle
precondition()
undpreconditionFailure()
sind die gleichen Verhaltensweisen aufweisen . Der Unterschied zwischen diesen Funktionen ist:precondition
Benötigen Sie eine Bedingung im Inneren, während SiepreconditionFailure
einfach wegwerfen.Das
precondition
ist im Release-Modus aktiv, sodass Sie die App beenden, wenn Sie Ihre App versenden und die Vorbedingung fehlschlägt.Assert
funktioniert standardmäßig nur im Debug-Modus.Ich habe diese großartige Erklärung gefunden, wann ich sie auf NSHipster verwenden soll:
quelle
Überprüfen Sie eine notwendige Bedingung, um Fortschritte zu erzielen.
Traditionelle Bestätigung im C-Stil mit einer optionalen Nachricht.
Verwenden Sie diese Funktion für interne Sicherheitsüberprüfungen, die während des Tests aktiv sind, jedoch die Leistung des Versandcodes nicht beeinträchtigen. So überprüfen Sie, ob die Verwendung in Release-Builds ungültig ist; siehe Voraussetzung.
In Spielplätzen und -Onone-Builds (die Standardeinstellung für die Debug-Konfiguration von Xcode): Wenn die Bedingung als falsch ausgewertet wird, stoppen Sie die Programmausführung nach dem Drucken der Nachricht in einem debuggbaren Zustand.
quelle