Wat is het verschil tussen precondition(condition: Bool, message: String)
en assert(condition: Bool, message: String)
in Swift?
Ik vind ze allebei hetzelfde. In welke context moeten we de een boven de ander gebruiken?
Antwoord 1, autoriteit 100%
Assert
is voor gezond verstandscontroles tijdens het testen, terwijl precondition
is om te waken tegen dingen die, als ze gebeuren, zouden betekenen dat je programma redelijkerwijs niet door kan gaan.
Dus je zou bijvoorbeeld een Assert
kunnen plaatsen op een berekening met verstandige resultaten (binnen bepaalde grenzen, bijvoorbeeld), om snel te ontdekken of je een fout hebt. Maar je zou daar niet mee willen verzenden, omdat het out-of-bound resultaat mogelijkgeldig is, en niet kritisch, dus je app zou niet moeten crashen (stel dat je het alleen gebruikt om de voortgang weer te geven in een voortgangsbalk).
Aan de andere kant is het controleren of een subscript op een array geldig is bij het ophalen van een element een precondition
. Er is geen redelijke volgende actie voor het array-object om te ondernemen wanneer om een ongeldig subscript wordt gevraagd, aangezien het moeteen niet-optionele waarde teruggeven.
Volledige tekst uit de documenten (probeer optie te klikken op Assert
en precondition
in Xcode):
Voorwaarde
Controleer een noodzakelijke voorwaarde om vooruitgang te boeken.
Gebruik deze functie om omstandigheden te detecteren die de
programma kan zelfs in de verzendcode niet doorgaan.
In speeltuinen en -Onone builds (de standaard voor Xcode’s Debug
configuratie): alsprecondition
evalueert naar onwaar, stop het programma
uitvoering in een foutopsporingsstatus na het afdrukken vanmessage
.In -O builds (de standaard voor de release-configuratie van Xcode):
alscondition
onwaar is, stop dan de uitvoering van het programma.In -Ounchecked builds wordt
condition
niet geëvalueerd, maar de
optimizer mag aannemen dat het zoualstrue
zou worden geëvalueerd. Mislukking
om aan die veronderstelling te voldoen in -Ounchecked builds is een serieuze
programmeerfout.
Bevestigen
Traditionele C-stijl bewering met een optioneel bericht.
Gebruik deze functie voor interne sanity checks die actief zijn
tijdens het testen, maar hebben geen invloed op de prestaties van de verzendcode.
Om te controleren op ongeldig gebruik in release-builds; zieprecondition
.
In speeltuinen en -Onone builds (de standaard voor Xcode’s Debug
configuratie): alsprecondition
evalueert naar onwaar, stop het programma
uitvoering in een foutopsporingsstatus na het afdrukken vanmessage
.In -O builds (de standaard voor de release-configuratie van Xcode),
condition
wordt niet geëvalueerd en er zijn geen effecten.In -Ounchecked builds wordt
condition
niet geëvalueerd, maar de
optimizer mag aannemen dat het zoualstrue
zou worden geëvalueerd. Mislukking
om aan die veronderstelling te voldoen in -Ounchecked builds is een serieuze
programmeerfout.
Antwoord 2, autoriteit 76%
Ik heb Swift beweert – de ontbrekende handleiding gevondenbehulpzaam zijn
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
En van Interessante discussies over Swift Evolution
– assert: uw eigen code controleren op interne fouten
– voorwaarde: om te controleren of uw klanten u geldige argumenten hebben gegeven.
Je moet ook voorzichtig zijn met wat je moet gebruiken, zie assertionFailure and Optimization Level
Antwoord 3, autoriteit 14%
De precondition
is actief in de release-modus, dus wanneer u uw app verzendt en de voorwaarde faalt, wordt de app beëindigd.
Assert
werkt standaard alleen in de foutopsporingsmodus.
Ik vond deze geweldige uitleg wanneer ik het op NSHipster moest gebruiken:
Beweringen zijn een concept dat is ontleend aan de klassieke logica. in logica,
beweringen zijn uitspraken over proposities binnen een bewijs. In
programmering, beweringen duiden aannames aan die de programmeur heeft gemaakt
over de aanvraag op de plaats waar ze worden aangegeven.Bij gebruik in de hoedanigheid van precondities en postcondities, die
beschrijf de verwachtingen over de staat van de code aan het begin en
einde van de uitvoering van een methode of functie, beweringen vormen een contract.
Beweringen kunnen ook worden gebruikt om voorwaarden tijdens runtime af te dwingen, in
om uitvoering te voorkomen wanneer bepaalde randvoorwaarden falen.
Antwoord 4, autoriteit 5%
voorwaarde
func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
Controleer een noodzakelijke voorwaarde om vooruitgang te boeken.
- Gebruik deze functie om omstandigheden te detecteren die het programma moeten verhinderen
zelfs in de verzendcode niet doorgaan. - In speeltuinen en -Onone-builds (de standaard voor Debug van Xcode
configuratie): als de conditie onwaar is, stop dan het programma
uitvoering in een foutopsporingsstatus na het afdrukken van het bericht. - In -O builds (de standaard voor de release-configuratie van Xcode): if
voorwaarde evalueert naar onwaar, stop de uitvoering van het programma. - In -Ounchecked builds wordt de conditie niet geëvalueerd, maar de optimizer
mag aannemen dat het zou evalueren naar waar. Daar niet aan voldoen
aanname in -Ounchecked builds is een ernstige programmeerfout.
bevestigen
func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
Traditionele C-stijl bewering met een optioneel bericht.
-
Gebruik deze functie voor interne gezondheidscontroles die actief zijn tijdens
testen, maar hebben geen invloed op de prestaties van de verzendcode. om te controleren op
ongeldig gebruik in release-builds; zie voorwaarde. -
In speeltuinen en -Onone builds (de standaard voor Xcode’s Debug
configuratie): als de conditie onwaar is, stop dan het programma
uitvoering in een foutopsporingsstatus na het afdrukken van het bericht. - In -O builds (de standaard voor de release-configuratie van Xcode),
toestand wordt niet geëvalueerd en er zijn geen effecten - In -Ounchecked builds wordt de conditie niet geëvalueerd, maar de optimizer
mag aannemen dat het zou evalueren naar waar. Daar niet aan voldoen
aanname in -Ounchecked builds is een ernstige programmeerfout
Antwoord 5
Ik wilde even mijn 2 cent toevoegen. U kunt zoveel beweringen in uw code toevoegen als u wilt. U kunt uw code verzenden met deze beweringen. Swift evalueert deze codeblokken NIET voor productie-apps. Deze worden alleen geëvalueerd in het geval van debug-modus.
Ook afbeelding van swift.org bijvoegen
Let ook op, bij randvoorwaarden is dit niet het geval.
Code die met voorwaarden wordt geleverd, crasht en de app wordt beëindigd als de voorwaarden niet als waar worden beoordeeld.
Zo kort, beweringen zijn voor foutopsporing, maar kunnen worden verzonden zonder de productie te beïnvloeden. Behandelingen worden geëvalueerd in de debugmodus, maar niet in productie.
en
Voorwaarden zijn om ervoor te zorgen dat onverwachte dingen niet gebeuren op productieomgeving. Die voorwaarden worden geëvalueerd en beëindigt uw app voor het geval ze worden geëvalueerd om vals te zijn