2010-04-07 12 views
222

कोड की इस पंक्ति का क्या अर्थ है?प्रश्न चिह्न और कोलन (?: टर्नरी ऑपरेटर) का उद्देश्य उद्देश्य-सी में क्या है?

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

? और : मुझे भ्रमित।

+2

ध्यान दें कि यह प्रश्न चिह्न होना चाहिए, उद्धरण चिह्न नहीं। – clahey

+0

ओह, क्षमा करें आप सही हैं। – rdesign

+6

कंपाइलर भी 'चर' की अनुमति देता है?: दूसरा वैरिएबल ', इसका क्या अर्थ है?' – Tony

उत्तर

375

यह वह जगह है सी ternary operator (ऑब्जेक्टिव-सी सी के एक सुपरसेट है):

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

शब्दार्थ

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

कोई पहला तत्व के साथ त्रिगुट के बराबर है (उदाहरण के लिए variable ?: anotherVariable) का अर्थ है (valOrVar != 0) ? valOrVar : anotherValOrVar

+25

(अद्यतन: यक! उत्तर के रूप में दोबारा पोस्ट करना।) टर्नरी ऑपरेटर के बारे में इतना महत्वपूर्ण क्या है कि इसका उपयोग उन स्थानों पर किया जा सकता है जो एक और नहीं कर सकते हैं। यानी: एक शर्त या विधि पैरामीटर के अंदर। [NSString stringWithFormat: @ "स्थिति:% @", (? StatusBool @ "स्वीकृत": @ "अस्वीकृत")] ... जो पूर्वप्रक्रमक स्थिरांक के लिए एक महान प्रयोग है: #define statusString (statusBool? @ "स्वीकृत": @ "अस्वीकृत") ... तो: [NSString stringWithFormat: @ "स्थिति:% @", statusString] इस का उपयोग करें और में स्थानीय चर को रिहा करने से बचाता है, तो-और कुछ पैटर्न। FTW! –

+3

और इसकी इतनी एन ई ए टी! – Morkrom

+41

शायद यह उल्लेख करने लायक है कि पहले तत्व ('?:') के बिना टर्नरी ऑपरेटर * ऐसी स्थिति में * बेहतर है * जिसमें बाएं तरफ एक अभिव्यक्ति है, क्योंकि '?:' इसे एक से अधिक बार मूल्यांकन करने से रोकती है। उदाहरण के लिए: '[myArray firstObject]? [myArray firstObject]: @ "हैलो वर्ल्ड"; 'कॉल' पहले ऑब्जेक्ट 'दो बार कॉल करें (यदि' firstObject' 'nil' वापस नहीं आता है), जहां '[myArray firstObject] है?: @ "हैलो वर्ल्ड"; 'समान परिणाम उत्पन्न करता है लेकिन कभी भी' firstObject' को एक से अधिक बार कॉल नहीं करता है। – nhgrif

4

यह सी का हिस्सा है, इसलिए यह उद्देश्य-सी विशिष्ट नहीं है। यहाँ एक if बयान में एक अनुवाद है:

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

यह सिर्फ एक अगर-तो-और कुछ बयान लेखन का एक संक्षिप्त रूप है। इसका मतलब निम्न कोड जैसा है:

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

यह टर्नरी या सशर्त ऑपरेटर है। यह मूल रूप है:

condition ? valueIfTrue : valueIfFalse 

जहां मूल्यों का मूल्यांकन किया जाएगा, तो उनका मूल्यांकन किया जाएगा।

+25

इसे अधिक सरल, स्पष्ट और स्पष्ट वोट दिया जाना चाहिए था। – Celeritas

+7

बस स्पष्ट करने के लिए, यह मानों तक ही सीमित नहीं है। शर्त? codeIfTrue: codeIfFalse' –

13

यह सामान्य सामान्य ternary operator है। यदि प्रश्न चिह्न से पहले का हिस्सा सत्य है, तो यह कॉलन से पहले हिस्सा का मूल्यांकन करता है और देता है, अन्यथा यह कॉलन के बाद भाग का मूल्यांकन करता है और देता है।

a?b:c 

तरह

if(a) 
    b; 
else 
    c; 
34

बैरी Wark उत्तम स्पष्टीकरण पर भवन ... है

क्या त्रिगुट ऑपरेटर के बारे में इतना महत्वपूर्ण है कि यह स्थानों में इस्तेमाल किया जा सकता है कि एक अगर-बाकी नही सकता। यानी: एक शर्त या विधि पैरामीटर के अंदर।

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

... जो पूर्वप्रक्रमक स्थिरांक के लिए एक महान प्रयोग है:

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

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

यह आप का उपयोग और अगर-किसी और पैटर्न में स्थानीय चर जारी करने के लिए होने से बचाता है। FTW!

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

मैं इस बात की सराहना करता हूं कि आप साइट पर योगदान करने का प्रयास कर रहे हैं, लेकिन उत्तर पोस्ट कर रहे हैं जो केवल दोहराए गए उत्तरों को दोहराते हैं, आम तौर पर निराश होते हैं, क्योंकि यह सिर्फ प्रश्नों को झुकाता है। –

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; 
30

बस तर्क

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

+3

सरल और सुरुचिपूर्ण – Barracuda

+3

यह वास्तव में ** सर्वश्रेष्ठ ** उत्तर है क्योंकि अन्य उत्तरों का अर्थ यह है कि परिणामस्वरूप आप केवल "मूल्य" प्राप्त कर सकते हैं, जबकि इससे पता चलता है कि आप परिणामस्वरूप किसी भी मनमाना कोड डाल सकते हैं। –

1

मैं बस कुछ त्रिगुट ऑपरेटर के बारे में नया सीखा होगा। मध्य ऑपरेंड को छोड़ने वाला संक्षिप्त रूप वास्तव में सुरुचिपूर्ण है, और कई कारणों में से एक है कि सी प्रासंगिक बना हुआ है। एफवाईआई, मैंने पहली बार सी # में लागू एक नियमित रूप से संदर्भ के संदर्भ में अपना सिर प्राप्त किया, जो टर्नरी ऑपरेटर का भी समर्थन करता है। चूंकि टर्नरी ऑपरेटर सी में है, इसलिए इसका कारण यह है कि यह अन्य भाषाओं में होगा जो अनिवार्य रूप से इसके विस्तार (ई जी, ऑब्जेक्टिव-सी, सी #) हैं।

1

के रूप में हर किसी के लिए भेजा है कि, यह सशर्त ऑपरेटर का प्रतिनिधित्व

if (condition){ 
    true 
} 
else { 
    false 
} 

त्रिगुट ऑपरेटर (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)?:c

?: के बजाय हम उपयोग कर सकते हैं ?? तेज है के बराबर है

if (a>c)?a:c के बराबर है।

0

टर्नरी ऑपरेटर उदाहरण।यदि isFemale बूलियन चर का मान हाँ, प्रिंट "लिंग महिला है" है अन्यथा

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

"लिंग पुरुष है" ऑब्जेक्टिव-सी

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

मज़ेदार तथ्य, उद्देश्य-सी में आप अशक्त/शून्य जाँच करने के लिए उदाहरण के लिए चाहते हैं:

-(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]?: @""; 
} 

क्योंकि ऑब्जेक्टिव-सी में:

  1. यदि कोई वस्तु शून्य है, तो यह बूलियन के रूप में झूठी वापसी करेगा;
  2. टर्नरी ऑपरेटर का दूसरा पैरामीटर खाली हो सकता है, क्योंकि यह परिणाम '?' के बाईं ओर परिणाम देगा

तो कहते हैं कि तुम लिखने करते हैं:

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

दूसरा पैरामीटर एक बूलियन मान, इस प्रकार एक अपवाद फेंक दिया है लौटा रहा है।

संबंधित मुद्दे