Apa arti dari tanda tanya dan titik dua (?: Operator ternary) pada objektif-c?

270

Apa arti dari baris kode ini?

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

The ?dan :membingungkan saya.

danielreiser
sumber
1
Ini adalah operator ternary if-then-else
Klaus Byskov Pedersen
3
Perhatikan bahwa ini harus tanda tanya, bukan tanda kutip.
clahey
6
Kompilator juga sepertinya mengizinkan variable ?: anotherVariable, apa artinya ini? '
Tony
15
Terner tanpa unsur pertama artinya sama dengan(valOrVar != 0) ? valOrVar : anotherValorvar
Scott Lahteine

Jawaban:

430

Ini adalah operator ternary C (Objective-C adalah superset dari C):

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

secara semantik setara dengan

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

Terner tanpa elemen pertama (mis. variable ?: anotherVariable) Berarti sama dengan(valOrVar != 0) ? valOrVar : anotherValOrVar

Barry Wark
sumber
28
(perbarui: Yuck! Reposting sebagai jawaban.) Apa yang sangat penting tentang operator ternary adalah ia dapat digunakan di tempat-tempat yang jika tidak ada yang tidak bisa. yaitu: Di dalam parameter kondisi atau metode. [NSString stringWithFormat: @ "Status:% @", (statusBool? @ "Disetujui": @ "Ditolak")] ... yang sangat berguna untuk konstanta preprosesor: #define statusString (statusBool? @ "Disetujui": @ "Ditolak") ... lalu: [NSString stringWithFormat: @ "Status:% @", statusString] Ini menyelamatkan Anda dari keharusan menggunakan dan melepaskan variabel lokal dalam pola if-else. FTW!
Bruno Bronosky
42
Mungkin perlu disebutkan bahwa operator ternary tanpa elemen pertama ( ?:) bahkan lebih baik dalam situasi di mana sisi kiri adalah ekspresi, karena ?:mencegahnya dievaluasi lebih dari sekali. Misalnya: [myArray firstObject] ? [myArray firstObject] : @"Hello World";panggilan firstObjectdua kali (jika firstObjecttidak kembali nil), di mana [myArray firstObject] ?: @"Hello World";menghasilkan hasil yang identik tetapi tidak pernah memanggil firstObjectlebih dari satu kali.
nhgrif
akhirnya ~~~~~ Saya telah menggunakan operator ini sejak lama (defo favorit saya) tetapi tidak pernah tahu apa namanya. pertanyaan besar sekarang telah dijawab. Terima kasih
Thang Do
Juga ingin menambahkan bahwa operator ternary tanpa elemen pertama ?:juga disebut operator Elvis karena kemiripan emoji dengan penyanyi. Dan tentu saja dalam kasus ini karena kita menjatuhkan satu elemen, itu bukan lagi operator ternary tetapi operator biner . Operator biner meliputi sebagian besar operator biasanya kita gunakan ketika pemrograman ( *, +, -, ^, |, ||, &, >>, dll).
tomacco
179

Ini operator ternary atau kondisional. Bentuk dasarnya adalah:

condition ? valueIfTrue : valueIfFalse

Di mana nilai-nilai hanya akan dievaluasi jika mereka dipilih.

Sean
sumber
8
Hanya untuk memperjelas, tidak terbatas pada nilai. condition ? codeIfTrue : codeIfFalse
Mike S
46

Sederhananya, logikanya

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

Varun Goyal
sumber
4
Ini sebenarnya jawaban terbaik karena jawaban yang lain menyiratkan bahwa Anda hanya dapat memiliki "nilai" sebagai hasilnya, sedangkan ini menunjukkan bahwa Anda dapat menempatkan kode arbitrer sebagai hasilnya.
Mike S
36

Membangun penjelasan luar biasa Barry Wark ...

Apa yang begitu penting tentang operator ternary adalah ia dapat digunakan di tempat-tempat yang jika tidak bisa tidak. yaitu: Di dalam parameter kondisi atau metode.

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

... yang sangat berguna untuk konstanta preprosesor:

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

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

Ini menghemat Anda dari keharusan menggunakan dan melepaskan variabel lokal dalam pola if-else. FTW!

Richard Bronosky
sumber
14

Itu hanya operator ternary biasa . Jika bagian sebelum tanda tanya itu benar, ia mengevaluasi dan mengembalikan bagian sebelum titik dua, jika tidak ia mengevaluasi dan mengembalikan bagian setelah titik dua.

a?b:c

seperti

if(a)
    b;
else
    c;
Brian
sumber
4

Ini adalah bagian dari C, jadi tidak spesifik Objective-C. Berikut ini terjemahan ke dalam ifpernyataan:

if (inPseudoEditMode)
    label.frame = kLabelIndentedRec;
else
    label.frame = kLabelRect;
Dietrich Epp
sumber
4

Ini hanya bentuk singkat dari penulisan pernyataan if-then-else. Artinya sama dengan kode berikut:

if(inPseudoEditMode)
  label.frame = kLabelIndentedRect;
else
  label.frame = kLabelRect;
Claus Broch
sumber
2

Contoh operator ternary. Jika nilai variabel boolean isFemale adalah YA, cetak "GENDER IS FEMALE" jika tidak, "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.

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

Untuk 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.
pegangan tangan
sumber
2

Fakta menyenangkan, di objektif-c jika Anda ingin memeriksa null / nil Misalnya:

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

Cara cepat untuk melakukannya adalah:

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

Kemudian Anda dapat memperbaruinya dengan cara paling sederhana:

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

Karena dalam Objective-C:

  1. jika suatu objek nil, itu akan mengembalikan false sebagai boolean;
  2. Parameter kedua Operator Ternary dapat kosong, karena akan mengembalikan hasil di sebelah kiri '?'

Jadi katakanlah Anda menulis:

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

parameter kedua mengembalikan nilai boolean, dengan demikian pengecualian dilemparkan.

BananZ
sumber
1

Ini adalah operator ternary, seperti pernyataan if / else.

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

Dalam operator ternary seperti itu: kondisi? apa yang harus dilakukan jika kondisinya benar: apa yang harus dilakukan jika itu salah;

(a > b) ? what to do if true : what to do if false;
cdhw
sumber
2
Saya menghargai bahwa Anda berusaha berkontribusi ke situs ini, tetapi memposting jawaban yang hanya mengulangi apa yang sudah dinyatakan oleh jawaban lain umumnya tidak disarankan, karena hanya mengacaukan pertanyaan.
Chris Hayes
1

Saya baru belajar sesuatu yang baru tentang operator ternary. Bentuk pendek yang menghilangkan operan tengah benar-benar elegan, dan merupakan salah satu dari banyak alasan bahwa C tetap relevan. FYI, saya pertama kali benar-benar memahami hal ini dalam konteks rutin yang diimplementasikan dalam C #, yang juga mendukung operator ternary. Karena operator ternary berada dalam C, maka dapat dipastikan bahwa itu akan menjadi bahasa lain yang pada dasarnya adalah ekstensi daripadanya (misalnya, Objective-C, C #).

David A. Gray
sumber
1

Seperti semua orang menyebutnya, Ini adalah cara untuk mewakili operator bersyarat

if (condition){ 
    true 
} 
else {
    false
}

menggunakan operator ternary (condition)? true:false Untuk menambahkan informasi tambahan, Dalam cepat kami memiliki cara baru untuk menggunakannya ??.

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

Yang mirip dengan

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

setara dengan

if (a>c)?a:c ==> Sama dengan if (a>c)?:c

alih-alih ?:kita bisa menggunakan ??swift.


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

cara

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