เครื่องหมายคำถามและเครื่องหมายทวิภาค (?: ตัวดำเนินการประกอบไปด้วยสามส่วน) หมายถึงอะไรในวัตถุประสงค์ -c


270

บรรทัดโค้ดนี้มีความหมายว่าอย่างไร

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

?และ:สร้างความสับสนให้ฉัน


1
มันเป็นผู้ประกอบการถ้าแล้วจึงอื่นประกอบไปด้วย
Klaus Byskov Pedersen

3
โปรดทราบว่านี่ควรเป็นเครื่องหมายคำถามไม่ใช่เครื่องหมายคำพูด
clahey

6
คอมไพเลอร์ดูเหมือนว่าจะอนุญาตvariable ?: anotherVariableสิ่งนี้หมายความว่าอย่างไร '
โทนี่

15
(valOrVar != 0) ? valOrVar : anotherValorvar
Ternary ที่

คำตอบ:


430

นี่คือผู้ประกอบการที่ประกอบไปด้วย C (Objective-C เป็นเซ็ตของ C):

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

เทียบเท่ากับความหมาย

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

Ternary ที่ไม่มีองค์ประกอบแรก (เช่นvariable ?: anotherVariable) หมายถึงเช่นเดียวกับ(valOrVar != 0) ? valOrVar : anotherValOrVar


28
(อัปเดต: Yuck! การโพสต์ซ้ำเป็นคำตอบ) สิ่งที่สำคัญมากเกี่ยวกับผู้ประกอบการที่ประกอบไปด้วยไตรภาคคือสามารถใช้ในสถานที่ที่ผู้อื่นไม่สามารถทำได้ ie: ภายในเงื่อนไขเงื่อนไขหรือพารามิเตอร์ [NSString stringWithFormat: @ "สถานะ:% @", (statusBool? @ "อนุมัติ": @ "ปฏิเสธ")] ... ... ซึ่งเป็นการใช้งานที่ยอดเยี่ยมสำหรับค่าคงที่ของตัวประมวลผลล่วงหน้า: #define statusString (statusBool? @ "อนุมัติ": @ "ถูกปฏิเสธ") ... จากนั้น: [NSString stringWithFormat: @ "สถานะ:% @", statusString] สิ่งนี้ช่วยให้คุณไม่ต้องใช้และปล่อยตัวแปรโลคัลในรูปแบบ if-else FTW!
Bruno Bronosky

42
อาจเป็นเรื่องที่ควรค่าแก่การกล่าวถึงว่าผู้ประกอบการที่ไม่มีองค์ประกอบแรก ( ?:) นั้นดีกว่าในสถานการณ์ที่ด้านซ้ายเป็นนิพจน์เนื่องจากการ?:ป้องกันไม่ให้มีการประเมินมากกว่าหนึ่งครั้ง ตัวอย่างเช่น: [myArray firstObject] ? [myArray firstObject] : @"Hello World";เรียกfirstObjectสองครั้ง (ถ้าfirstObjectไม่ส่งคืนnil), ซึ่ง[myArray firstObject] ?: @"Hello World";ให้ผลลัพธ์เหมือนกัน แต่จะไม่เรียกfirstObjectมากกว่าหนึ่งครั้ง
nhgrif

ในที่สุด ~~~~~ ฉันได้ใช้โอเปอร์เรเตอร์นี้มานาน (defo ที่ฉันชอบ) แต่ไม่เคยรู้เลยว่ามันเรียกอะไร คำถามใหญ่ได้รับการตอบแล้ว ขอบคุณ
Thang Do

นอกจากนี้ต้องการเพิ่มว่าผู้ประกอบการที่ไม่มีองค์ประกอบแรกที่?:เรียกว่าผู้ประกอบการ Elvisเนื่องจากemoji มีความคล้ายคลึงกับนักร้อง และแน่นอนในกรณีนี้เมื่อเราวางองค์ประกอบหนึ่งมันไม่ได้เป็นผู้ประกอบการที่ประกอบไปด้วยผู้ประกอบการไบนารี่ ผู้ประกอบการไบนารีรวมถึงส่วนใหญ่ของผู้ประกอบการที่เรามักจะใช้เมื่อการเขียนโปรแกรม ( *, +, -, ^, |, ||, &, >>ฯลฯ )
tomacco

179

มันเป็นผู้ประกอบการที่สามหรือมีเงื่อนไข มันเป็นรูปแบบพื้นฐานคือ:

condition ? valueIfTrue : valueIfFalse

โดยที่จะมีการประเมินค่าเฉพาะถ้าเลือกไว้


8
เพียงชี้แจงก็ไม่ได้ จำกัด อยู่ที่ค่า condition ? codeIfTrue : codeIfFalse
Mike S

46

เพียงแค่ตรรกะจะเป็น

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


4
นี่เป็นคำตอบที่ดีที่สุดเพราะคำตอบอื่น ๆ บ่งบอกว่าคุณสามารถมี "คุณค่า" ได้เท่านั้นในขณะที่สิ่งนี้แสดงให้เห็นว่าคุณสามารถใส่รหัสโดยพลการใด ๆ ก็ได้
Mike S

36

คำอธิบายที่ยอดเยี่ยมของ Barry Wark ...

สิ่งที่สำคัญมากเกี่ยวกับผู้ประกอบการที่ประกอบไปด้วยไตรภาคคือสามารถใช้ในสถานที่ที่ผู้อื่นไม่สามารถทำได้ ie: ภายในเงื่อนไขเงื่อนไขหรือพารามิเตอร์

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

... ซึ่งเป็นประโยชน์อย่างมากสำหรับค่าคงที่ของโปรเซสเซอร์

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

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

สิ่งนี้จะช่วยให้คุณไม่ต้องใช้และปล่อยตัวแปรโลคัลในรูปแบบ if-else FTW!


14

นั่นเป็นเพียงปกติประกอบ ternary หากส่วนก่อนเครื่องหมายคำถามเป็นจริงมันจะประเมินและส่งคืนส่วนก่อนเครื่องหมายโคลอนมิฉะนั้นจะประเมินและส่งคืนส่วนหลังเครื่องหมายโคลอน

a?b:c

ก็เหมือน

if(a)
    b;
else
    c;

4

นี่เป็นส่วนหนึ่งของ C ดังนั้นจึงไม่ใช่ Objective-C เจาะจง ต่อไปนี้เป็นคำแปลลงในifคำสั่ง:

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

4

มันเป็นเพียงรูปแบบย่อของการเขียนคำสั่ง if-then-else มันหมายถึงเช่นเดียวกับรหัสต่อไปนี้:

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

2

ตัวอย่างผู้ประกอบการที่สามถ้าค่าของตัวแปรบูลีน isFemale คือ YES ให้พิมพ์ "GENDER IS FEMALE" มิฉะนั้น "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.

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.

สำหรับสวิฟท์

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

ความจริงสนุกใน Object-c ถ้าคุณต้องการตรวจสอบ null / nil ตัวอย่างเช่น:

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

วิธีที่รวดเร็วในการทำคือ:

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

จากนั้นคุณสามารถอัปเดตเป็นวิธีที่ง่ายที่สุด:

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

เพราะใน Objective-C:

  1. ถ้าวัตถุนั้นเป็นศูนย์มันจะคืนค่าเท็จเป็นบูลีน
  2. พารามิเตอร์ที่สองของ Ternary Operator สามารถว่างได้เนื่องจากจะส่งคืนผลลัพธ์ทางด้านซ้ายของ '?'

ดังนั้นสมมติว่าคุณเขียน:

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

พารามิเตอร์ตัวที่สองส่งคืนค่าบูลีนดังนั้นจึงมีข้อผิดพลาดเกิดขึ้น


1

มันเป็นผู้ประกอบการที่สามเช่นคำสั่ง if / else

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

ในผู้ประกอบการที่สามมันเป็นเช่นนั้น: เงื่อนไข? จะทำอย่างไรถ้าเงื่อนไขเป็นจริง: จะทำอย่างไรถ้าเป็นเท็จ

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

2
ฉันขอขอบคุณที่คุณพยายามมีส่วนร่วมในเว็บไซต์ แต่การโพสต์คำตอบที่ทำซ้ำสิ่งที่คำตอบอื่น ๆ ที่ระบุไว้นั้นหมดกำลังใจโดยทั่วไปเพราะมันเป็นเพียงการสรุปคำถาม
Chris Hayes

1

ฉันเพิ่งเรียนรู้สิ่งใหม่เกี่ยวกับผู้ประกอบการที่สาม แบบฟอร์มสั้น ๆ ที่ละเว้นตัวถูกดำเนินการตรงกลางนั้นสง่างามอย่างแท้จริงและเป็นหนึ่งในหลาย ๆ เหตุผลที่ C ยังคงเกี่ยวข้อง FYI ฉันได้รับความคิดริเริ่มในบริบทของกิจวัตรประจำวันที่ใช้ใน C # ซึ่งสนับสนุนผู้ประกอบการที่สาม เนื่องจากตัวดำเนินการประกอบไปด้วยอยู่ใน C จึงเป็นเหตุผลว่าจะเป็นภาษาอื่นที่เป็นส่วนขยายดังกล่าว (เช่น Objective-C, C #)


1

ตามที่ทุกคนอ้างว่ามันเป็นวิธีการแสดงตัวดำเนินการตามเงื่อนไข

if (condition){ 
    true 
} 
else {
    false
}

ใช้ประกอบ ternary ต้องการเพิ่มข้อมูลเพิ่มเติมในรวดเร็วเรามีวิธีการใหม่ของการเป็นตัวแทนโดยใช้(condition)? true:false ??

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

ซึ่งคล้ายกับ

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

เทียบเท่ากับ

if (a>c)?a:c ==> เท่ากับ if (a>c)?:c

แทนที่จะ?:ใช้??อย่างรวดเร็ว


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

วิธี

int padding; 
if ([[UIScreen mainScreen] bounds].size.height <= 480)
  padding = 15;
else
  padding = 55; 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.