O que significa o ponto de interrogação e os dois-pontos (operador?: Ternário) no objective-c?

O que essa linha de código significa?

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

O ? e : confunda-me

Este é o operador C terná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 (valOrVar != 0) ? valOrVar : anotherValOrVar

É o operador ternário ou condicional. Sua forma básica é:

 condition ? valueIfTrue : valueIfFalse 

Onde os valores só serão avaliados se forem escolhidos.

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 lugares que um if-else não pode. ie: Dentro de um parâmetro de condição ou método.

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

… que é um ótimo uso para constantes de pré-processador:

 // in your pch file... #define statusString (statusBool ? @"Approved" : @"Rejected") // in your m file... [NSString stringWithFormat: @"Status: %@", statusString] 

Isso evita que você tenha que usar e liberar variables ​​locais em padrões if-else. FTW!

Simplesmente, a lógica seria

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

Esse é apenas o operador ternário de sempre. Se a parte antes do ponto de interrogação for verdadeira, ela avalia e retorna a parte antes dos dois pontos, caso contrário, ela avalia e retorna a parte depois dos dois pontos.

 a?b:c 

é como

 if(a) b; else c; 

Isso faz parte do C, então não é específico do Objective-C. Aqui está uma tradução para uma declaração if :

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

É apenas uma pequena forma de escrever uma declaração if-then-else. Isso significa o mesmo que o código a seguir:

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

É um operador ternário, como uma declaraçã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 falso;

 (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 intermediário é realmente elegante e é uma das muitas razões pelas quais C permanece relevante. FYI, primeiro eu realmente tenho a minha cabeça em torno disso 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 ele estaria em outras linguagens que são essencialmente extensões dele (por exemplo, Objective-C, C #).

Como todos nos referiram, é uma forma de representar o operador condicional

 if (condition){ true } else { false } 

usando o operador ternário (condition)? true:false (condition)? true:false Para adicionar informações adicionais, Em swift, temos uma nova maneira de representá-lo usando ?? .

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

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 ?: podemos usar ?? é rápido.

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

significa

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

Exemplo de operador ternário. Se o valor da variável booleana isFemale for SIM, imprima “GÊNERO É FÊMEA”, caso contrário “GÊNERO É MASCULINO”

 ? 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 objective-c, se você quiser verificar null / nil 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] : @""; } 

Então você pode atualizá-lo da maneira mais simples:

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

Porque em Objective-C:

  1. se um object for nulo, retornará falso como booleano;
  2. O segundo parâmetro do Operador Ternário pode estar vazio, pois ele retornará o resultado à esquerda de ‘?’

Então digamos que você escreva:

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

o segundo parâmetro está retornando um valor booleano, portanto, uma exceção é lançada.