2014-06-11 24 views
26

Come si converte il seguente in Swift da Objective-C?Riga singola se la dichiarazione in Swift

if (myVar) return; 

Swift non utilizza le parentesi attorno al condizionale, tuttavia il codice seguente restituisce un errore.

if myVar return 
+5

differenza Objective C, bretelle sono obbligatori mentre usando if a Swift. La ragione di questo è rendere il codice più sicuro. – ZeMoon

+0

devi aggiungere le parentesi '{}' per tutti i rami, ma le parentesi sono opzionali '()', puoi tenerle se vuoi. – holex

risposta

35

In Swift le parentesi non sono opzionali come se fossero in Objective-C (C). I paren d'altra parte sono opzionali. Esempi:

valido Swift:

if someCondition { 
    // stuff 
} 

if (someCondition) { 
    // stuff 
} 

valido Swift:

if someCondition 
    // one liner 

if (someCondition) 
    // one liner 

Questa decisione design elimina un'intera classe di bug che può venire da impropriamente utilizzando un'istruzione if senza parentesi come il seguente caso , dove potrebbe non essere sempre chiaro che il valore di something verrà modificato in modo condizionale, ma il valore di somethingElse cambierà ogni volta.

Bool something = true 
Bool somethingElse = true 

if (anUnrelatedCondition) 
    something = false 
    somethingElse = false 

print something // outputs true 
print somethingElse // outputs false 
+7

Un esempio di bug ampiamente pubblicizzato correlato a questo è [Bug SSL/TLS di Apple] (https: //www.imperialviolet.org/2014/02/22/applebug.html), mentre Swift era in sviluppo. A volte mi chiedo se questa decisione di progettazione sia stata presa per questo, o se sia solo una coincidenza. È un dettaglio interessante di Swift, dal momento che è molto raro che i linguaggi "Mi piace" impongano uno stile di codifica. – Jonas

+0

Errore SSL/TLS di Apple - non indica che il problema è rappresentato da una linea singola. Mostra chiaramente che CMD + V non dovrebbe usare l'impostazione "Key-delay" e "key-repeat" della tastiera e dovrebbe incollare una sola volta. Prova a copiare una riga di testo e premi CMD + V un po 'più del solito. A meno che, lo sviluppatore abbia intenzionalmente messo due "goto fail" consecutivi; supponendo di lavorare in un singolo blocco se, per assicurarsi che se nel caso il puntatore di controllo non obbedisca la prima volta, ripetere una seconda volta sarebbe d'aiuto. "Sei ancora qui ???? Ti ho già detto di fallire .... GOTO FAIL in questo istante !!!" –

+0

Non è possibile inserire parentesi attorno alle istruzioni 'if let'. –

12

One-line if, una riga while e una riga for sono considerati un cattivo stile da molti sviluppatori, perché sono meno leggibile e presumibilmente una fonte di molti errori.

Swift ha risolto il problema vietando le istruzioni di controllo del flusso a una linea; le parentesi graffe non sono optional ...

if someCondition { 
    // stuff 
} 

Naturalmente, si può ancora fare

if someCondition { return } 

Ci sono anche ragioni di implementazione. Avere le parentesi intorno alla condizione come facoltativo rende l'analisi molto più difficile. L'applicazione di parentesi semplifica nuovamente l'analisi.

+0

"Presunto" è giusto. Con convenzioni come l'uso costante di parentesi graffe Allman e indentazione, era già molto prevenibile. –

40

Bene come gli altri ragazzi hanno anche spiegato che le parentesi graffe sono un must in fretta. Ma per semplicità si può sempre fare qualcosa di simile:

let a = -5 

// if the condition is true then doThis() gets called else doThat() gets called 
a >= 0 ? doThis(): doThat() 

func doThis() { 
    println("Do This") 
} 

func doThat() { 
    println("Do That") 
} 
4

È possibile utilizzare la nuova Nil-coalescenza operatore, dal momento che Swift 3 nel caso in cui quando si ha bisogno solo di impostare il valore di default in caso di se fallisce:

let someValue = someOptional ?? "" 

nel caso in cui someOptional è false, questo operatore di assegnazione "" per someValue

var dataDesc = (value == 7) ? "equal to 7" : "not equal to 7" 
1

Qui è una soluzione semplice che ho usato nei miei progetti.

Swift 3+

var retunString = (state == "OFF") ? "securityOn" : "securityOff"