Antworten:
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
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
Und aus interessanten Diskussionen über Swift Evolution
- assert: Überprüfen Sie Ihren eigenen Code auf interne Fehler
- Voraussetzung: um zu überprüfen, ob Ihre Kunden Ihnen gültige Argumente gegeben haben.
Außerdem müssen Sie bei der Verwendung vorsichtig sein, siehe assertionFailure und Optimization Level
precondition()
und preconditionFailure()
sind die gleichen Verhaltensweisen aufweisen . Der Unterschied zwischen diesen Funktionen ist: precondition
Benötigen Sie eine Bedingung im Inneren, während Sie preconditionFailure
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:
Behauptungen sind ein Konzept, das der klassischen Logik entlehnt ist. Behauptungen sind in der Logik Aussagen über Sätze innerhalb eines Beweises. Bei der Programmierung bezeichnen Behauptungen Annahmen, die der Programmierer über die Anwendung an dem Ort gemacht hat, an dem sie deklariert wurden.
In der Eigenschaft von Vor- und Nachbedingungen, die Erwartungen an den Status des Codes zu Beginn und am Ende der Ausführung einer Methode oder Funktion beschreiben, bilden Zusicherungen einen Vertrag. Assertions können auch verwendet werden, um Bedingungen zur Laufzeit zu erzwingen, um die Ausführung zu verhindern, wenn bestimmte Voraussetzungen fehlschlagen.
Voraussetzung
func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
Überprüfen Sie eine notwendige Bedingung, um Fortschritte zu erzielen.
behaupten
func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
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.