Que signifie cette ligne de code?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
Les ?
et :
me confondent.
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
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.
Simplement, la logique serait
(condition) ? {code for YES} : {code for NO}
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!
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;
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;
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;
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:
Alors laissez vous écrivez:
[self getSomeString] != nil?: @"";
le second paramètre renvoie une valeur booléenne, une exception est donc levée.
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.
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 #).
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;
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.
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;