2014-06-11 7 views
26

Wie würde man folgendes Swift von Objective-C-Format konvertieren?Einzeiliger if-Anweisung in Swift

if (myVar) return; 

Swift verwendet keine Klammern um die Bedingung, aber der folgende Code einen Fehler gibt.

+5

Im Gegensatz zu Objective-C, sind Klammern obligatorisch, während, wenn Aussagen in Swift verwenden. Der Grund dafür ist, den Code sicherer zu machen. – ZeMoon

+0

Sie müssen die Klammern hinzuzufügen '{}' für alle Zweige, aber die Klammern sind optional '()', können Sie sie halten, wenn Sie möchten. – holex

Antwort

35

In Swift sind die Klammern nicht optional wie in Objective-C (C). Die Parens hingegen sind optional. Beispiele:

Valid Swift:

if someCondition { 
    // stuff 
} 

if (someCondition) { 
    // stuff 
} 

Ungültige Swift:

if someCondition 
    // one liner 

if (someCondition) 
    // one liner 

Diese Design-Entscheidung beseitigt eine ganze Klasse von Fehlern, die durch ein nicht ordnungsgemäß mit einer if-Anweisung ohne Klammern wie der folgende Fall kommen kann , wo es nicht immer klar sein könnte, dass something ‚s-Wert bedingt geändert werden, aber somethingElse‘ s-Wert wird jedes Mal ändern.

Bool something = true 
Bool somethingElse = true 

if (anUnrelatedCondition) 
    something = false 
    somethingElse = false 

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

Ein Beispiel einer breiten Öffentlichkeit bekannt Fehler, die im Zusammenhang mit dieser, so ist [SSL/TLS-Fehler von Apple] (https: //www.imperialviolet.org/2014/02/22/applebug.html), während Swift in Entwicklung war. Ich frage mich manchmal, ob diese Designentscheidung deswegen getroffen wurde, oder ob es nur zufällig ist. Es ist ein interessantes Detail von Swift, da es für C-ähnliche Sprachen sehr ungewöhnlich ist, einen Kodierungsstil zu erzwingen. – Jonas

+0

Apples SSL/TLS-Fehler - zeigt nicht, dass einzelne Zeile If's das Problem sind. Es zeigt deutlich, dass CMD + V nicht die "Key-Delay" - und "Key-Repeat" -Einstellung der Tastatur verwenden sollte und nur einmal einfügen sollte. Versuchen Sie, eine Textzeile zu kopieren, und drücken Sie CMD + V etwas länger als gewöhnlich. Das ist, es sei denn, der Entwickler setzte absichtlich zwei aufeinanderfolgende "goto fail"; Angenommen, in einem einzigen if-Block zu arbeiten, um sicherzustellen, dass, falls der Steuerzeiger dem ersten Mal nicht gehorcht, eine Wiederholung ein zweites Mal helfen würde. "Bist du noch hier ???? Ich habe dir schon gesagt, dass du scheitern sollst ... GOTO FAIL in diesem Moment !!!" –

+0

Sie können Klammern nicht um 'if let'-Anweisungen setzen. –

12

Einzeiliger if, einzeilige while und einzeilige for sind ein schlechter Stil von vielen Entwicklern betrachtet, weil sie weniger lesbar und angeblich eine Quelle vieler Fehler.

Swift löste das Rätsel durch Verbieten einzeilige Aussagen Flusssteuerung; die Klammern sind nicht optional ...

if someCondition { 
    // stuff 
} 

Natürlich können Sie noch

if someCondition { return } 

tun können, gibt es auch Gründe Umsetzung. Wenn die Klammern um die Bedingung herum optional sind, wird das Parsing viel schwieriger. Das Erzwingen von geschweiften Klammern vereinfacht das erneute Parsen.

+0

"Angeblich" ist ungefähr richtig. Mit Konventionen wie der konsequenten Verwendung von Allman-Zahnspangen und Einkerbungen war es bereits sehr vermeidbar. –

40

auch die anderen Jungs auch erklärt, dass Klammern ein Muss in geschickter sind. Aber die Einfachheit halber kann man immer etwas tun:

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

Sie können neuen verwenden Nil-Coalescing Operator, da Swift 3 im Fall, wenn Sie nur Standardwert für den Fall festgelegt muss die, wenn nicht:

let someValue = someOptional ?? "" 
bei

wenn someOptional false ist "dieser Operator assign" EinWert ist

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

Hier eine einfache Lösung, die ich in meinen Projekten verwendet.

Swift 3+

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