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.


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


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.


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

46

Sederhananya, logikanya

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


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!


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;

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;

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;

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.

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.


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;

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 #).


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.


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; 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.