web-dev-qa-db-fra.com

Que signifient les points d'interrogation et les deux points (?: Opérateur ternaire) dans objective-c?

Que signifie cette ligne de code?

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

Les ? et : me confondent.

263
danielreiser

C'est le C opérateur ternaire (Objective-C est un sur-ensemble de C):

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

est sémantiquement équivalent à

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

Le ternaire sans premier élément (par exemple variable ?: anotherVariable) a la même signification que (valOrVar != 0) ? valOrVar : anotherValOrVar

424
Barry Wark

C'est l'opérateur ternaire ou conditionnel. Sa forme de base est:

condition ? valueIfTrue : valueIfFalse

Où les valeurs ne seront évaluées que si elles sont choisies.

175
Sean

Simplement, la logique serait

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

41
Varun Goyal

S'appuyant sur l'excellente explication de Barry Wark ...

Ce qui est si important chez l’opérateur ternaire, c’est qu’il peut être utilisé dans des endroits impossibles à un autre. C'est-à-dire: à l'intérieur d'un paramètre de condition ou de méthode.

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

... qui est très utile pour les constantes de préprocesseur:

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

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

Cela vous évite d'avoir à utiliser et à publier des variables locales dans des modèles if-else. FTW!

36
Bruno Bronosky

C'est juste l'habituel opérateur ternaire . Si la partie précédant le point d'interrogation est vraie, elle évalue et retourne la partie située avant les deux points, sinon elle évalue et renvoie la partie après les deux points.

a?b:c

est comme

if(a)
    b;
else
    c;
13
Brian

Cela fait partie de C, donc ce n'est pas spécifique à Objective-C. Voici une traduction dans une déclaration if:

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

C'est juste une forme courte d'écriture d'une déclaration if-then-else. Cela signifie la même chose que le code suivant:

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

Fait amusant, dans objectif-c si vous voulez vérifier null/nil Par exemple:

-(NSString*) getSomeStringSafeCheck
{
    NSString *string = [self getSomeString];
    if(string != nil){
        return String;
    }
    return @"";
}

Le moyen rapide de le faire est:

-(NSString*) getSomeStringSafeCheck
{
    return [self getSomeString] != nil ? [self getSomeString] : @"";
}

Ensuite, vous pouvez le mettre à jour de la manière la plus simple:

-(NSString*) getSomeStringSafeCheck
{
    return [self getSomeString]?: @"";
}

Parce qu'en Objective-C:

  1. si un objet est nul, il retournera faux comme booléen;
  2. Le second paramètre de l'opérateur ternaire peut être vide car il renverra le résultat à gauche de '?'

Alors laissez vous écrivez:

[self getSomeString] != nil?: @"";

le second paramètre renvoie une valeur booléenne, une exception est donc levée.

2
Jun Jie Gan

Exemple d'opérateur ternaire.Si la valeur de la variable isFemale boolean est YES, imprimez "GENDER IS FEMALE" sinon "GENDER IS MALE"

? means = execute the codes before the : if the condition is true. 
: means = execute the codes after the : if the condition is false.

Objectif c

BOOL isFemale = YES;
NSString *valueToPrint = (isFemale == YES) ? @"GENDER IS FEMALE" : @"GENDER IS MALE";
NSLog(valueToPrint); //Result will be "GENDER IS FEMALE" because the value of isFemale was set to YES.

Pour Swift

let isFemale = false
let valueToPrint:String = (isFemale == true) ? "GENDER IS FEMALE" : "GENDER IS MALE"
print(valueToPrint) //Result will be  "GENDER IS MALE" because the isFemale value was set to false.
2
handiansom

Je viens d'apprendre quelque chose de nouveau sur l'opérateur ternaire. La forme courte qui omet l'opérande du milieu est vraiment élégante et est l'une des nombreuses raisons pour lesquelles C reste pertinent. Pour votre information, je me suis d'abord vraiment bien compris dans le contexte d'une routine implémentée en C #, qui prend également en charge l'opérateur ternaire. Puisque l'opérateur ternaire est en C, il va de soi que ce serait dans d'autres langages qui en sont essentiellement des extensions (par exemple Objective-C, C #).

1
David A. Gray
int padding = ([[UIScreen mainScreen] bounds].size.height <= 480) ? 15 : 55;

veux dire

int padding; 
if ([[UIScreen mainScreen] bounds].size.height <= 480)
  padding = 15;
else
  padding = 55; 
1
Abo3atef

Comme tout le monde l’a dit, c’est une façon de représenter un opérateur conditionnel

if (condition){ 
    true 
} 
else {
    false
}

utilisation de l'opérateur ternaire (condition)? true:false Pour ajouter des informations supplémentaires, dans Swift, nous avons un nouveau moyen de le représenter avec ??.

let imageObject: UIImage = (UIImage(named: "ImageName")) ?? (initialOfUsername.capitalizedString).imageFromString

Qui est semblable à

int a = 6, c= 5;
if (a > c) 
{ 
 a is greater
} else {
 c is greater
}

est équivalent à

if (a>c)?a:c ==> est égal à if (a>c)?:c

au lieu de ?:, nous pouvons utiliser ?? est Swift.

1
user5503563

C'est un opérateur ternaire, comme une déclaration if/else.

if(a > b) {
what to do;
}
else {
what to do;
}

En opérateur ternaire c'est comme ça: condition? que faire si la condition est vraie; que faire si c'est faux;

(a > b) ? what to do if true : what to do if false;
1
cdhw