Objektif-c'de soru işareti ve iki nokta üst üste (?: Üçlü operatör) ne anlama geliyor?


270

Bu kod satırı ne anlama geliyor?

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

?Ve :beni karıştırmayın.


1
Bu üçlü if-then-else operatörü
Klaus Byskov Pedersen

3
Bunun tırnak işareti değil, soru işareti olması gerektiğini unutmayın.
clahey

6
Derleyici de izin veriyor gibi görünüyor variable ?: anotherVariable, bu ne anlama geliyor? '
Tony

15
İlk unsuru bulunmayan üçlü şu anlama gelir(valOrVar != 0) ? valOrVar : anotherValorvar
Scott Lahteine

Yanıtlar:


430

Bu C üçlü operatörüdür (Objective-C, C'nin bir üst kümesidir):

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

anlamsal olarak eşdeğerdir

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

İlk elemanı olmayan üçlü (örn. variable ?: anotherVariable),(valOrVar != 0) ? valOrVar : anotherValOrVar


28
(güncelleme: Yuck! Cevap olarak yeniden gönderme.) Üçlü operatörle ilgili en önemli şey, if-if'in yapamayacağı yerlerde kullanılabilmesidir. ie: Bir koşul veya yöntem parametresinin içinde. [NSString stringWithFormat: @ "Status:% @", (statusBool? @ "Onaylandı": @ "Reddedildi")] ... önişlemci sabitleri için harika bir kullanım: #define statusString (statusBool? @ "Onaylandı": @ "Reddedildi") ... sonra: [NSString stringWithFormat: @ "Status:% @", statusString] Bu, if-else kalıplarında yerel değişkenleri kullanmak ve serbest bırakmak zorunda kalmamanızı sağlar. FTW!
Bruno Bronosky

42
Birinci eleman ( ?:) içermeyen üçlü operatörün , sol tarafın bir ifade olduğu durumlarda daha iyi olduğunu belirtmek gerekir , çünkü ?:birden fazla değerlendirilmesini engeller. Örneğin: iki kez [myArray firstObject] ? [myArray firstObject] : @"Hello World";çağrı yapar firstObject( firstObjectgeri dönmezse nil), burada [myArray firstObject] ?: @"Hello World";aynı sonucu üretir ancak asla bir firstObjectdefadan fazla çağrılamaz.
nhgrif

nihayet ~~~~~ Bu operatörü uzun zamandır kullanıyorum (favorim defo) ama ne dediğini hiç bilmiyordum. büyük soru şimdi cevaplandı. Teşekkürler
Thang Do

Ayrıca, ilk öğeye sahip olmayan üçlü operatörün , şarkıcıya emoji benzerliği nedeniyle Elvis operatörü?: olarak da adlandırıldığını eklemek istersiniz . Ve elbette bu durumda bir öğeyi düşürdüğümüzde, artık üçlü bir operatör değil, ikili bir operatör . İkili operatörler programlarken biz genellikle (kullanma operatörlerin büyük çoğunluğu dahil , , , , , , , , vs). *+-^|||&>>
tomacco

179

Üçlü veya koşullu operatör. Temel şekli:

condition ? valueIfTrue : valueIfFalse

Değerler yalnızca seçildiklerinde değerlendirilecekler.


8
Sadece açıklığa kavuşturmak için, değerlerle sınırlı değildir. condition ? codeIfTrue : codeIfFalse
Mike S

46

Basitçe, mantık

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


4
Bu aslında en iyi cevaptır, çünkü diğer cevaplar sonuç olarak sadece bir "değere" sahip olabileceğiniz anlamına gelirken, sonuç olarak herhangi bir keyfi kod koyabileceğinizi gösterir.
Mike S

36

Barry Wark'ın mükemmel açıklaması üzerine inşa ...

Üçlü operatör için bu kadar önemli olan şey, if-else'in yapamayacağı yerlerde kullanılabilmesidir. ie: Bir koşul veya yöntem parametresinin içinde.

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

... önişlemci sabitleri için büyük bir kullanımdır:

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

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

Bu, if-else kalıplarında yerel değişkenleri kullanmak ve serbest bırakmak zorunda kalmamanızı sağlar. FTW!


14

Bu sadece olağan üçlü operatör . Soru işaretinden önceki bölüm doğruysa, iki nokta üst üste işaretini değerlendirir ve iki nokta üst üste işaretinden sonraki bölümü döndürür.

a?b:c

gibi

if(a)
    b;
else
    c;

4

Bu C'nin bir parçasıdır, bu nedenle Objective-C'ye özgü değildir. İşte ififadeye bir çeviri :

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

4

Bu, if-then-else deyimi yazmanın kısa bir biçimidir. Aşağıdaki kodla aynı anlama gelir:

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

2

Üçlü işleç örneği. İsFemale boolean değişkeninin değeri EVET ise, "CİNSİYET KADIN" aksi takdirde "CİNSİYET ERKEK" yazdırabilirsiniz

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

Objective-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.

Swift için

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

Eğlenceli gerçek, null / nil değerini kontrol etmek istiyorsanız obj-c'de Örneğin:

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

Bunu yapmanın hızlı yolu:

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

Ardından en basit şekilde güncelleyebilirsiniz:

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

Çünkü Objective-C'de:

  1. bir nesne sıfır ise, boole olarak false değerini döndürür;
  2. Üçlü Operatörün ikinci parametresi boş olabilir, çünkü sonuç '?'

Diyelim ki yazıyorsunuz:

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

ikinci parametre bir boole değeri döndürüyor, bu nedenle bir istisna atılıyor.


1

Üçlü işleç, if / else deyimi gibi.

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

Üçlü operatörde durum şöyledir: koşul doğruysa ne yapmalı: yanlışsa ne yapmalı;

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

2
Siteye katkıda bulunmaya çalıştığınız için teşekkür ederim, ancak daha önce belirtilmiş olan diğer cevapları tekrarlayan cevaplar göndermek genellikle cesaret kırıcıdır, çünkü sadece soruları toplamaktadır.
Chris Hayes

1

Üçlü operatör hakkında yeni bir şey öğrendim. Orta işleneni atlayan kısa form gerçekten zariftir ve C'nin alakalı kalmasının birçok nedeninden biridir. FYI, ilk olarak C # 'da uygulanan rutin bağlamında başımı gerçekten ele aldım. Üçlü operatör C'de olduğundan, esasen onun uzantısı olan diğer dillerde olması mantıklıdır (örneğin, Objective-C, C #).


1

Herkesin belirttiği gibi, koşullu operatörü temsil etmenin bir yoludur

if (condition){ 
    true 
} 
else {
    false
}

üçlü operatör kullanma (condition)? true:false Ek bilgi eklemek için, hızlı bir şekilde bunu kullanarak temsil etmenin yeni bir yoluna sahibiz ??.

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

Hangisine benzer

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

eşittir

if (a>c)?a:c ==> eşittir if (a>c)?:c

yerine ?:kullanabileceğimiz ??hızlı.


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

anlamına geliyor

int padding; 
if ([[UIScreen mainScreen] bounds].size.height <= 480)
  padding = 15;
else
  padding = 55; 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.