O que essa linha de código significa?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
O ?
e :
me confundem.
variable ?: anotherVariable
, o que isso significa?
(valOrVar != 0) ? valOrVar : anotherValorvar
O que essa linha de código significa?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
O ?
e :
me confundem.
variable ?: anotherVariable
, o que isso significa?
(valOrVar != 0) ? valOrVar : anotherValorvar
Respostas:
Este é o operador secundário (Objective-C é um superconjunto de C):
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
é semanticamente equivalente a
if(inPseudoEditMode) {
label.frame = kLabelIndentedRect;
} else {
label.frame = kLabelRect;
}
O ternário sem primeiro elemento (por exemplo variable ?: anotherVariable
) significa o mesmo que(valOrVar != 0) ? valOrVar : anotherValOrVar
?:
) é ainda melhor em situações em que o lado esquerdo é uma expressão, pois ?:
impede que seja avaliado mais de uma vez. Por exemplo: [myArray firstObject] ? [myArray firstObject] : @"Hello World";
chama firstObject
duas vezes (se firstObject
não retornar nil
), onde [myArray firstObject] ?: @"Hello World";
produz o resultado idêntico, mas nunca chama firstObject
mais de uma vez.
?:
também é chamado de operador Elvis devido à semelhança emoji com o cantor. E, é claro, neste caso, como estamos descartando um elemento, ele não é mais um operador ternário, mas um operador binário . Operadores binários incluem a grande maioria dos operadores geralmente usamos durante a programação ( *
, +
, -
, ^
, |
, ||
, &
, >>
, etc).
Simplesmente, a lógica seria
(condition) ? {code for YES} : {code for NO}
Com base na excelente explicação de Barry Wark ...
O que é tão importante sobre o operador ternário é que ele pode ser usado em locais que um if-else não pode. Ex .: Dentro de uma condição ou parâmetro de método.
[NSString stringWithFormat: @"Status: %@", (statusBool ? @"Approved" : @"Rejected")]
... que é um ótimo uso para constantes do pré-processador:
// in your pch file...
#define statusString (statusBool ? @"Approved" : @"Rejected")
// in your m file...
[NSString stringWithFormat: @"Status: %@", statusString]
Isso evita que você precise usar e liberar variáveis locais em padrões if-else. FTW!
Esse é apenas o operador ternário usual . Se a parte antes do ponto de interrogação for verdadeira, ela avalia e retorna a parte antes dos dois pontos, caso contrário, avalia e retorna a parte após os dois pontos.
a?b:c
é como
if(a)
b;
else
c;
Isso faz parte do C, portanto não é específico do Objective-C. Aqui está uma tradução para uma if
declaração:
if (inPseudoEditMode)
label.frame = kLabelIndentedRec;
else
label.frame = kLabelRect;
É apenas uma forma curta de escrever uma declaração if-then-else. Significa o mesmo que o seguinte código:
if(inPseudoEditMode)
label.frame = kLabelIndentedRect;
else
label.frame = kLabelRect;
Exemplo de operador ternário.Se o valor da variável booleana isFemale for YES, imprima "GENDER IS FEMALE", caso contrário "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.
Objetivo-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.
Para 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.
Curiosidade, no objetivo-c, se você quiser verificar nulo / zero Por exemplo:
-(NSString*) getSomeStringSafeCheck
{
NSString *string = [self getSomeString];
if(string != nil){
return String;
}
return @"";
}
A maneira rápida de fazer isso é:
-(NSString*) getSomeStringSafeCheck
{
return [self getSomeString] != nil ? [self getSomeString] : @"";
}
Em seguida, você pode atualizá-lo da maneira mais simples:
-(NSString*) getSomeStringSafeCheck
{
return [self getSomeString]?: @"";
}
Porque no Objective-C:
Então, digamos que você escreva:
[self getSomeString] != nil?: @"";
o segundo parâmetro está retornando um valor booleano, portanto, uma exceção é lançada.
É um operador ternário, como uma instrução if / else.
if(a > b) {
what to do;
}
else {
what to do;
}
No operador ternário, é assim: condição? o que fazer se a condição for verdadeira: o que fazer se for falsa;
(a > b) ? what to do if true : what to do if false;
Acabei de aprender algo novo sobre o operador ternário. A forma abreviada que omite o operando do meio é realmente elegante e é uma das muitas razões pelas quais C permanece relevante. Para sua informação, eu realmente entendi isso no contexto de uma rotina implementada em C #, que também suporta o operador ternário. Como o operador ternário está em C, é lógico que seria em outros idiomas que são essencialmente extensões do mesmo (por exemplo, Objective-C, C #).
Como todo mundo se referiu, é uma maneira de representar o operador condicional
if (condition){
true
}
else {
false
}
using operator ternary (condition)? true:false
Para adicionar informações adicionais, temos rapidamente uma nova maneira de representá-las usando ??
.
let imageObject: UIImage = (UIImage(named: "ImageName")) ?? (initialOfUsername.capitalizedString).imageFromString
O que é semelhante a
int a = 6, c= 5;
if (a > c)
{
a is greater
} else {
c is greater
}
é equivalente a
if (a>c)?a:c
==> É igual a if (a>c)?:c
em vez de ?:
podermos usar ??
é rápido.