Co oznacza ten wiersz kodu?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
?
I :
mylić mnie.
variable ?: anotherVariable
, co to oznacza?
(valOrVar != 0) ? valOrVar : anotherValorvar
Co oznacza ten wiersz kodu?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
?
I :
mylić mnie.
variable ?: anotherVariable
, co to oznacza?
(valOrVar != 0) ? valOrVar : anotherValorvar
Odpowiedzi:
To jest operator trójskładnikowy (Cel-C jest nadzbiorem C):
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
jest semantycznie równoważny z
if(inPseudoEditMode) {
label.frame = kLabelIndentedRect;
} else {
label.frame = kLabelRect;
}
Trójka bez pierwszego elementu (np. variable ?: anotherVariable
) Oznacza to samo co(valOrVar != 0) ? valOrVar : anotherValOrVar
?:
) jest jeszcze lepszy w sytuacjach, w których lewa strona jest wyrażeniem, ponieważ ?:
uniemożliwia jej ocenę więcej niż jeden raz. Na przykład: [myArray firstObject] ? [myArray firstObject] : @"Hello World";
dzwoni firstObject
dwukrotnie (jeśli firstObject
nie zwraca nil
), gdzie [myArray firstObject] ?: @"Hello World";
daje identyczny wynik, ale nigdy nie dzwoni firstObject
więcej niż raz.
?:
jest również nazywany operatorem Elvisa ze względu na podobieństwo emoji do piosenkarza. I oczywiście w tym przypadku, gdy upuszczamy jeden element, nie jest on już operatorem trójskładnikowym, ale operatorem binarnym . Operatory binarne obejmują większość operatorów zazwyczaj używamy podczas programowania ( *
, +
, -
, ^
, |
, ||
, &
, >>
, etc).
Po prostu logika byłaby
(condition) ? {code for YES} : {code for NO}
Opierając się na doskonałym wytłumaczeniu Barry'ego Warka ...
To, co jest tak ważne w trójskładnikowym operatorze, to fakt, że można go używać w miejscach, których nie mógłby wykonać if-else. tj .: Wewnątrz warunku lub parametru metody.
[NSString stringWithFormat: @"Status: %@", (statusBool ? @"Approved" : @"Rejected")]
... co jest doskonałym zastosowaniem dla stałych preprocesora:
// in your pch file...
#define statusString (statusBool ? @"Approved" : @"Rejected")
// in your m file...
[NSString stringWithFormat: @"Status: %@", statusString]
Dzięki temu nie musisz używać i zwalniać zmiennych lokalnych we wzorcach if-else. FTW!
To tylko zwykły operator trójskładnikowy . Jeśli część przed znakiem zapytania jest prawdziwa, ocenia i zwraca część przed dwukropkiem, w przeciwnym razie ocenia i zwraca część po dwukropku.
a?b:c
jest jak
if(a)
b;
else
c;
Jest to część C, więc nie jest specyficzna dla Celu C. Oto tłumaczenie na if
oświadczenie:
if (inPseudoEditMode)
label.frame = kLabelIndentedRec;
else
label.frame = kLabelRect;
To tylko krótka forma napisania instrukcji „jeśli-to-jeszcze”. Oznacza to to samo, co następujący kod:
if(inPseudoEditMode)
label.frame = kLabelIndentedRect;
else
label.frame = kLabelRect;
Przykład operatora trójskładnikowego. Jeśli wartością zmiennej boolean isFemale jest TAK, należy wydrukować „PŁEĆ JEST KOBIETA”, w przeciwnym razie „PŁCI JEST MĘŻCZYZNA”
? means = execute the codes before the : if the condition is true.
: means = execute the codes after the : if the condition is false.
Cel 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.
Dla 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.
Ciekawostka, w celu-c, jeśli chcesz sprawdzić null / nil Na przykład:
-(NSString*) getSomeStringSafeCheck
{
NSString *string = [self getSomeString];
if(string != nil){
return String;
}
return @"";
}
Szybki sposób to zrobić:
-(NSString*) getSomeStringSafeCheck
{
return [self getSomeString] != nil ? [self getSomeString] : @"";
}
Następnie możesz zaktualizować go w najprostszy sposób:
-(NSString*) getSomeStringSafeCheck
{
return [self getSomeString]?: @"";
}
Ponieważ w celu C:
Powiedzmy, że piszesz:
[self getSomeString] != nil?: @"";
drugi parametr zwraca wartość logiczną, dlatego zgłaszany jest wyjątek.
Jest to operator trójskładnikowy, podobnie jak instrukcja if / else.
if(a > b) {
what to do;
}
else {
what to do;
}
W operatorze trójskładnikowym wygląda to tak: warunek? co zrobić, jeśli warunek jest prawdziwy: co zrobić, jeśli jest fałszywy;
(a > b) ? what to do if true : what to do if false;
Właśnie nauczyłem się czegoś nowego na temat operatora trójskładnikowego. Krótka forma pomijająca środkowy operand jest naprawdę elegancka i jest jednym z wielu powodów, dla których C pozostaje istotny. Do waszej informacji, po raz pierwszy naprawdę się tym zajmowałem w kontekście procedury zaimplementowanej w języku C #, która obsługuje również operatora trójskładnikowego. Ponieważ operator trójskładnikowy znajduje się w C, zrozumiałe jest, że byłoby w innych językach, które są w zasadzie jego rozszerzeniami (np. Objective-C, C #).
Jak wszyscy to powiedzieli, jest to sposób reprezentowania operatora warunkowego
if (condition){
true
}
else {
false
}
za pomocą operatora trójskładnikowego (condition)? true:false
Aby dodać dodatkowe informacje, W trybie szybkim mamy nowy sposób ich reprezentowania za pomocą ??
.
let imageObject: UIImage = (UIImage(named: "ImageName")) ?? (initialOfUsername.capitalizedString).imageFromString
Który jest podobny do
int a = 6, c= 5;
if (a > c)
{
a is greater
} else {
c is greater
}
jest równa
if (a>c)?a:c
==> Jest równe if (a>c)?:c
zamiast ?:
możemy użyć ??
jest szybki.