Was bedeuten das Fragezeichen und der Doppelpunkt (?: ternärer Operator) in object-c?

Lesezeit: 3 Minuten

Benutzeravatar von danielreiser
Danielreiser

Was bedeutet diese Codezeile?

label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;

Das ? und : verwirre mich.

  • Es ist die Dreiheit wenn-dann-sonst Operator

    – Klaus Byskov Pedersen

    7. April 2010 um 19:46 Uhr

  • Beachten Sie, dass dies ein Fragezeichen und kein Anführungszeichen sein sollte.

    – Clay

    7. April 2010 um 19:48 Uhr

  • Der Compiler scheint es auch zu ermöglichen variable ?: anotherVariableWas bedeutet das?’

    – Toni

    30. Dezember 2011 um 17:31 Uhr

  • Die Ternäre ohne erstes Element bedeutet dasselbe wie (valOrVar != 0) ? valOrVar : anotherValorvar

    – Scott Lahteine

    24. März 2012 um 2:11 Uhr

Benutzeravatar von Barry Wark
Barry Wark

Das ist das C ternärer Operator (Objective-C ist eine Obermenge von C):

label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;

ist semantisch äquivalent zu

if(inPseudoEditMode) {
 label.frame = kLabelIndentedRect;
} else {
 label.frame = kLabelRect;
}

Die Ternäre ohne erstes Element (zB variable ?: anotherVariable) bedeutet dasselbe wie (valOrVar != 0) ? valOrVar : anotherValOrVar

  • (Update: Yuck! Reposting als Antwort.) Was am ternären Operator so wichtig ist, ist, dass er an Stellen verwendet werden kann, an denen ein if-else nicht möglich ist. dh: Innerhalb einer Bedingung oder eines Methodenparameters. [NSString stringWithFormat: @”Status: %@”, (statusBool ? @”Approved” : @”Rejected”)] …was eine großartige Verwendung für Präprozessorkonstanten ist: #define statusString (statusBool ? @”Approved” : @”Rejected”) …dann: [NSString stringWithFormat: @”Status: %@”, statusString] Dies erspart Ihnen die Verwendung und Freigabe lokaler Variablen in if-else-Mustern. FTW!

    – Bruno Bronosky

    6. Mai 2010 um 15:52 Uhr


  • Es ist wahrscheinlich erwähnenswert, dass der ternäre Operator ohne das erste Element (?:) ist noch besser in Situationen, in denen die linke Seite ein Ausdruck ist, wie die ?: verhindert, dass es mehr als einmal ausgewertet wird. Zum Beispiel: [myArray firstObject] ? [myArray firstObject] : @"Hello World"; Anrufe firstObject zweimal (ggf firstObject kehrt nicht zurück nil), wo [myArray firstObject] ?: @"Hello World"; erzeugt das identische Ergebnis, ruft aber nie auf firstObject mehr als einmal.

    – nhgrif

    9. Juli 2014 um 0:33 Uhr

  • schließlich~~~~~ Ich benutze diesen Operator seit Ewigkeiten (auf jeden Fall mein Favorit), aber ich wusste nie, wie er heißt. Die große Frage ist nun beantwortet. Vielen Dank

    – Thang Do

    10. November 2015 um 7:50 Uhr

  • Ich möchte auch hinzufügen, dass der ternäre Operator ohne das erste Element ?: heißt auch die Elvis-Operator aufgrund der Emoji Ähnlichkeit mit dem Sänger. Und da wir in diesem Fall ein Element weglassen, ist es natürlich kein a mehr ternärer Operator aber ein binärer Operator. Binäre Operatoren umfassen die überwiegende Mehrheit der Operatoren, die wir normalerweise beim Programmieren verwenden (*,+,-,^, |,||, &, >>etc).

    – Tomaten

    5. Februar 2018 um 18:07 Uhr


Benutzeravatar von Sean
Sean

Es ist der ternäre oder bedingte Operator. Seine Grundform ist:

condition ? valueIfTrue : valueIfFalse

Wobei die Werte nur ausgewertet werden, wenn sie gewählt werden.

  • Nur zur Verdeutlichung, es ist nicht auf Werte beschränkt. condition ? codeIfTrue : codeIfFalse

    – Mike S

    23. Februar 2016 um 21:21 Uhr

Benutzeravatar von Varun Goyal
Varun Goyal

Einfach wäre die Logik

(condition) ? {code for YES} : {code for NO}

  • Das ist eigentlich die Beste Antwort, weil die anderen Antworten implizieren, dass Sie nur einen “Wert” als Ergebnis haben können, während dies zeigt, dass Sie jeden beliebigen Code als Ergebnis eingeben können.

    – Mike S

    23. Februar 2016 um 21:19 Uhr

Aufbauend auf Barry Warks ausgezeichneter Erklärung …

Was am ternären Operator so wichtig ist, ist, dass er an Stellen verwendet werden kann, an denen ein if-else nicht möglich ist. dh: Innerhalb einer Bedingung oder eines Methodenparameters.

[NSString stringWithFormat: @"Status: %@", (statusBool ? @"Approved" : @"Rejected")]

… was eine großartige Verwendung für Präprozessorkonstanten ist:

// in your pch file...
#define statusString (statusBool ? @"Approved" : @"Rejected")

// in your m file...
[NSString stringWithFormat: @"Status: %@", statusString]

Dies erspart Ihnen die Verwendung und Freigabe lokaler Variablen in if-else-Mustern. FTW!

Das ist nur das Übliche ternärer Operator. Wenn der Teil vor dem Fragezeichen wahr ist, wird der Teil vor dem Doppelpunkt ausgewertet und zurückgegeben, andernfalls wird der Teil nach dem Doppelpunkt ausgewertet und zurückgegeben.

a?b:c

ist wie

if(a)
    b;
else
    c;

Benutzeravatar von Dietrich Epp
Dietrich Ep

Dies ist Teil von C, also nicht Objective-C-spezifisch. Hier ist eine Übersetzung in eine if Aussage:

if (inPseudoEditMode)
    label.frame = kLabelIndentedRec;
else
    label.frame = kLabelRect;

Benutzeravatar von rak appdev
rak appdev

Es ist nur eine Kurzform des Schreibens einer if-then-else-Anweisung. Es bedeutet dasselbe wie der folgende Code:

if(inPseudoEditMode)
  label.frame = kLabelIndentedRect;
else
  label.frame = kLabelRect;

1426750cookie-checkWas bedeuten das Fragezeichen und der Doppelpunkt (?: ternärer Operator) in object-c?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy