Schnelle Inline-Bedingung?

78

Wie mache ich das in Swift?

(someboolexpression ? "Return value 1" : "Return value 2")

(Nein, ich habe noch nicht das gesamte Handbuch gelesen ... Ich habe es wahrscheinlich auf Seite 2 verpasst!)

OK, es ist auf Seite 91 und die obigen Angaben scheinen korrekt zu sein. Ich versuche jedoch, dies in einer Zeichenfolge wie der folgenden zu verwenden:

println(" some string \(some expression ? "Return value 1" : "Return value 2")"

aber der compiler ist nicht glücklich. Irgendeine Idee, wenn dies möglich ist?

Das ist so nah wie ich nur konnte

let exists = "exists"
let doesnotexist= "does not exist"

println("  something \(fileExists ? exists : doesnotexist)")
Duncan Groenewald
quelle
Es ist wahrscheinlich ein Versehen in der Grammatik, und Sie möchten vielleicht einen Fehler darauf melden. Ich habe die Grammatik nicht daraufhin überprüft, aber es könnte erwähnenswert sein, dass es keine entkommenen Literale, sondern nur Variablen mag. Dh. Sie können dies nicht tun: println ("hello \ (" world ")"), aber Sie können dies tun: let world = "world"; println ("Hallo \ (Welt)"), wie Sie bemerkt haben. Zusammenfassend scheint es eine Variable und keinen Ausdruck zu wollen.
Chris Conover
Ich werde das tun, Prost. In der Zwischenzeit werde ich @ MikeS Antwort als die beste Option für jetzt akzeptieren
Duncan Groenewald
Sie benötigen ein Leerzeichen nach let doesnotexistoder ein Präprozessorfehler wird auftreten und stellen Sie sicher, dass Sie let fileExists: Booleinige wo vor der printlnAnweisung deklariert haben, die eigentlich printab Swift 2.0 sein sollte. Ansonsten habe ich Ihren Code ausprobiert, er funktioniert
einwandfrei

Antworten:

134

Wenn Sie nach einem Einzeiler suchen, können Sie die ?:Operation aus der Zeichenfolgeninterpolation herausziehen und +stattdessen verketten mit :

let fileExists = false // for example
println("something " + (fileExists ? "exists" : "does not exist"))

Ausgänge:

etwas existiert nicht

Mike S.
quelle
Warum kompiliert mich das nicht? `let answer = (enterName_text == nil)? "": enterName_text.text! `
Elad Benda
@EladBenda Dies wäre besser nicht als Kommentar, sondern als separate Frage mit Details zu enterName_text und dem Fehler, den Sie erhalten. Die beste Vermutung ist jedoch, dass Sie wirklich wollen: Wenn Sie antworten lassen = enterName_text? .Text {...}
Mike S
1
Als ich diesen ternären Operator zum ersten Mal ausprobierte, dachte ich, dass er in Swift nicht funktioniert. Habe hier gesucht und diese Antwort gefunden. Das Problem (aus einem C / C ++ - Hintergrund) bestand darin, kein Leerzeichen zwischen dem '?' und das erste Argument. Das '?' wird in Swift speziell für optionale Werte behandelt und das Leerzeichen macht deutlich, dass es sich wirklich um einen ternären Operator handelt.
Jeff Muir
26

Sie können den neuen Nil-Coalescing-Operator verwenden , der in Swift 3 eingeführt wurde . Wenn dies der Fall someOptionalist, wird der Standardwert zurückgegeben nil.

let someValue = someOptional ?? ""

Wenn hier someOptionalist nil, wird dieser Operator zuweisen ""zu someValue.

Vitaliy Gozhenko
quelle
Das ist so eine schnelle Antwort! Genau das, wonach ich gesucht habe.
Dustinrwh
20
var firstBool = true
var secondBool: Bool

firstBool == true ? (secondBool = true) : (secondBool = false)

In diesem Fall wird der zweiteBool in den erstenBool geändert. Sie können dies auch mit ganzen Zahlen und Zeichenfolgen tun

Esqarrouth
quelle
9

Es wird als " ternärer Operator " bezeichnet.

In Bezug auf die Antwort von @ Esqarrouth denke ich, dass ein besseres Format wäre:

Swift 3:

var firstBool = true
var secondBool: Bool

secondBool = firstBool ? true : false

Dies ist das gleiche wie:

var firstBool = true
var secondBool: Bool

if (firstBool == true) {
    secondBool = true
} else {
    secondBool = false
}
Ray Tso
quelle
6

Gut,

Wenn Sie die Bedingung mit dem Operator + mit der Zeichenfolge verketten, sollte dies funktionieren.

Deshalb ist Mike richtig.

var str = "Something = " + (1 == 1 ? "Yes" : "No")
Tanmay Bakshi
quelle
6

Du warst so nah dran. Muss nur einer Variablen zugewiesen werden:

self.automaticOption = (automaticOptionOfCar ? "Automatic" : "Manual")

Bearbeiten:

Irgendeine Idee, warum derselbe Ausdruck nicht in eine Zeichenfolge eingebettet werden kann?

Du kannst das tun:

let a = true
let b = 1
let c = 2

println("\(a ? 1: 2)")
Steve Rosenberg
quelle
Irgendeine Idee, warum derselbe Ausdruck nicht in eine Zeichenfolge eingebettet werden kann?
Duncan Groenewald
Mmm aber das geht nicht println("something \(automaticOptionOfCar ? "Automatic" : "Manual")")?
Duncan Groenewald
5

einfache Lösung, die ich in meinen Projekten verwendet habe

Swift 3+

var retunString = (state == "OFF") ? "securityOn" : "securityOff"
Sathya Baman
quelle
3

Ich habe Inline-Bedingungen wie folgt verwendet:

Die Funktion isFavorite gibt einen Boolen zurück

favoriteButton.tintColor = CoreDataManager.sharedInstance.isFavorite(placeId: place.id, type: 0) ? UIColor.white : UIColor.clear

tourOperatorsButton.isHidden = place.operators.count != 0 ? true : false

Sergio Trejo
quelle