2015-04-16 15 views

risposta

87

assert è per controlli di integrità durante le prove, mentre precondition è per la guardia contro le cose che, se capita, significherebbe il vostro programma proprio non poteva ragionevolmente procedere.

Quindi, ad esempio, è possibile inserire un assert su alcuni calcoli con risultati sensibili (entro certi limiti, ad esempio), per trovare rapidamente se si è verificato un errore. Ma non vorresti spedire con questo, dal momento che il risultato fuori limite potrebbe essere valido, e non critico, quindi non dovrebbe mandare in crash la tua app (supponiamo che lo stavi solo usando per mostrare i progressi in una barra di avanzamento) .

D'altra parte, controllare che un indice su un array sia valido quando si preleva un elemento è un precondition. Non esiste alcuna azione successiva ragionevole per l'oggetto array da eseguire quando viene richiesto un indice non valido, dal momento che lo deve restituire un valore non facoltativo a.

Testo integrale dalla documentazione (cercare l'opzione-clic assert e precondition in Xcode):

Presupposto

Controllare una condizione necessaria per fare in avanti il ​​progresso.

Utilizzare questa funzione per rilevare le condizioni che devono impedire al programma di procedere anche nel codice di spedizione.

  • nei campi da gioco e -Onone costruisce (il valore di default per la configurazione di debug di Xcode): se condition restituisce false, fermare il programma esecuzione in uno stato debuggable dopo la stampa message.

  • In -O builds (l'impostazione predefinita per la configurazione di rilascio di Xcode): se condition è false, interrompe l'esecuzione del programma.

  • In -Ounchecked build, condition non viene valutata, ma l'ottimizzatore può supporre che sarebbe restituire true. Fallimento per soddisfare tale ipotesi in build -Ounchecked è un grave errore di programmazione .

Assert

tradizionale stile C affermare, con un messaggio opzionale.

Utilizzare questa funzione per i controlli di integrità interna attivi durante il test, ma non influire sulle prestazioni del codice di spedizione. Per verificare l'utilizzo non valido nelle build di rilascio; vedi precondition.

  • nei campi da gioco e -Onone costruisce (il valore di default per la configurazione di debug di Xcode): se condition restituisce false, fermare il programma esecuzione in uno stato debuggable dopo la stampa message.

  • In -O build (l'impostazione predefinita per la configurazione di rilascio di Xcode), condition non viene valutata e non vi sono effetti.

  • In -Ounchecked build, condition non viene valutata, ma l'ottimizzatore può supporre che sarebbe restituire true. Fallimento per soddisfare tale ipotesi in build -Ounchecked è un grave errore di programmazione .

+1

"Ma non si vorrebbe spedire con quello, dal momento che il risultato out-of-bound * potrebbe * essere valido, e non critico quindi non dovrebbe mandare in crash la tua app" questo è molto vago per me. Gentilmente puoi includere un esempio esatto? Forse un po 'di codice. – Honey

+0

Rispondendo alla tua domanda, personalmente uso asserzioni per catturare cose che non dovrebbero accadere nella mia build mentre sto scrivendo e testandolo. Immagina una dichiarazione di guardia che legge JSON dove 'data [" nome "]' non esiste, ma dovrebbe. Avere un'affermazione all'interno della guardia ... mi avrebbe aiutato a cogliere il mio errore andando in crash e portandomi al problema. Analogamente, se questo codice era in produzione, l'asserzione non mandava in crash il programma e qualsiasi codice di backup che usavo ('return nil') avrebbe preso il sopravvento. –

8

Il precondition è attivo in modalità di rilascio in modo che quando si spedisce la tua app e la precondizione non è riuscita l'applicazione si interrompe. Assert funziona solo in modalità debug come predefinito.

ho trovato questo grande spiegazione quando usarlo su NSHipster:

asserzioni sono un concetto preso in prestito dalla logica classica. Nella logica, le asserzioni sono affermazioni sulle proposizioni all'interno di una dimostrazione. Nella programmazione , le asserzioni denotano supposizioni che il programmatore ha apportato sull'applicazione nel luogo in cui sono state dichiarate.

Quando utilizzato in qualità di precondizioni e postcondizioni, che descrivono aspettative sullo stato del codice all'inizio e fine dell'esecuzione di un metodo o funzione, asserzioni formano un contratto. Le asserzioni possono anche essere utilizzate per applicare le condizioni in fase di esecuzione, nell'ordine per impedire l'esecuzione quando alcune precondizioni falliscono.

+0

asserzioni possono essere attivate e disattivate utilizzando un flag di compilazione; possono essere attivi nel codice spedito. –

5

precondizione

func precondition(condition: @autoclosure() -> Bool, _ message: @autoclosure() -> String = default, file: StaticString = default, line: UWord = default) 

Controllare una condizione necessaria per fare in avanti il ​​progresso.

  1. Utilizzare questa funzione per rilevare le condizioni che devono impedire al programma di procedere anche nel codice di spedizione.
  2. Nei parchi giochi e -Onone builds (il valore predefinito per la configurazione del debug di Xcode ): se la condizione viene valutata su false, interrompere l'esecuzione del programma in uno stato debuggable dopo la stampa del messaggio.
  3. In -O builds (impostazione predefinita per la configurazione di rilascio di Xcode): se la condizione viene valutata su false, interrompere l'esecuzione del programma.
  4. In -Okecked build, la condizione non viene valutata, ma l'ottimizzatore può presupporre che si valuti come true. La mancata soddisfazione dell'ipotesi di in build con controllo dell'output è un grave errore di programmazione.

assert

func assert(condition: @autoclosure() -> Bool, _ message: @autoclosure() -> String = default, file: StaticString = default, line: UWord = default) 

tradizionale stile C affermare, con un messaggio opzionale.

  1. Usare questa funzione per i controlli di integrità interni che sono attivi durante test, ma non incidono prestazioni del codice di spedizione.Per verificare l'utilizzo non valido di nelle build di rilascio; vedere la precondizione.

  2. nei campi da gioco e -Onone costruisce (il valore di default per la configurazione di debug di Xcode): se la condizione è falsa, stop programma esecuzione in uno stato debuggable dopo la stampa del messaggio.

  3. in -o costruisce (il valore di default per la configurazione di uscita di Xcode), condizione non viene valutata, e non ci sono effetti
  4. In -Ounchecked build, condizione non viene valutato, ma l'ottimizzatore può supporre che sarebbe valutare per vero. Qualora non siano soddisfatte che assunzione in -Ounchecked costruisce è un grave erro programmazione
51

ho trovato Swift asserts - the missing manual di essere utile

     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 

E da Interesting discussions on Swift Evolution

- assert: controllare il proprio codice per errori interni

- presupposto: per la verifica che i tuoi clienti ti hanno dato un valido ARGOMENTI DELLE PARTI.

Inoltre, è necessario stare attenti su cosa utilizzare, vedere assertionFailure and Optmization Level

+0

Puoi approfondire la differenza tra codice e client? Per quanto riguarda il client, intendi come inserire numeri in cui è prevista una stringa? Non dovrebbe essere trattato con una semplice gestione degli errori? – Honey

+0

@Honey Penso che intenda gli argomenti/i risultati delle chiamate API di rete o dei plugin del cliente. –