2010-04-14 11 views
5

मैं स्टैनफोर्ड आईफोन पॉडकास्ट के माध्यम से काम कर रहा हूं और कुछ बुनियादी प्रश्न हैं।मूल उद्देश्य-सी वाक्यविन्यास: "% @"?

पहला: कोई आसान स्ट्रिंग कॉन्सटेनेशन क्यों नहीं है? (या क्या मैं इसे अभी याद कर रहा हूं?)

मुझे नीचे एनएसएलओजी के साथ मदद की ज़रूरत है, और यह नहीं पता कि यह वर्तमान में क्या कर रहा है (% @ भाग)। क्या आप बस उन जगहों को प्रतिस्थापित करते हैं जहां आपको कॉन्सटेनेशन की आवश्यकता होती है, और फिर अल्पविराम अंत में मूल्यों को अलग करता है?

NSString *path = @"~"; 
NSString *absolutePath = [path stringByExpandingTildeInPath]; 

NSLog(@"My home folder is at '%@'", absolutePath); 

किसी अन्य कार्यक्रमों की भाषा के साथ, जबकि मैं इस तरह यह किया है चाहता हूँ:

NSLog(@"My home folder is at " + absolutePath); 

धन्यवाद! (इसके अतिरिक्त, उद्देश्य-सी पर जावा/सी #/आदि शैली वाक्यविन्यास से परिचित किसी के लिए कोई भी अच्छा गाइड/संदर्भ?

+1

कोई आसान स्ट्रिंग concatenation क्यों नहीं है? '[@" foo "stringByAppendingString: @" bar "]'। हाँ सच। आप 'NSMutableString' के लिए दस्तावेज़ भी देख सकते हैं जो थोड़ा सा मदद करता है। –

+0

क्या आपको वाकई लगता है कि "foo" + "bar" की तुलना में यह "आसान" है? लेकिन क्या यह '% @' दृष्टिकोण से इसे करने का बेहतर तरीका है? – cksubs

+1

'stringByAppendingString' इरादे को ओवरलोड करने से अधिक स्पष्ट बनाता है। या यह समेकित करने के लिए ''' है? उस सम्मान में गलत ओवरलोडेड ऑपरेटर का उपयोग करना आसान है। इसके अलावा, यदि आप स्ट्रिंग में पूर्णांक जोड़ने का प्रयास करते हैं तो क्या होना चाहिए? जैसे '" foo "+ 6'। एक पूर्णांक के लिए एक स्ट्रिंग संलग्न करने के बारे में क्या? 'StringByAppendingString' का उपयोग करने का अर्थ है कि मुझे इसके बारे में सोचना नहीं है। शायद आप * आसान * * लेजर * के रूप में इतना मतलब नहीं है। – Duncan

उत्तर

13

%@ एक प्रारूप स्ट्रिंग में एक प्लेसहोल्डर, एक NSString उदाहरण के लिए है।

आप की तरह कुछ करते हैं:

NSLog(@"My home folder is at '%@'", absolutePath); 

तुम कह रहे हैं NSLog absolutePath स्ट्रिंग मान के साथ %@ प्लेसहोल्डर की जगह।

इसी तरह, अगर आप अधिक प्लेसहोल्डर डाल, आप और अधिक मूल्यों इस तरह उन प्लेसहोल्डर बदलने के लिए निर्दिष्ट कर सकते हैं:

NSString *absolutePath = @"/home/whatever"; 
NSLog(@"My home #%d folder is at '%@'", 5, absolutePath); 

प्रिंट होगा:

मेरे घर # 5 पर/घर/जो कुछ भी

स्ट्रिंग संयोजन करने के लिए एक आसान तरीका है:

NSString *s1 = @"Hello, "; 
NSString *s2 = @"world."; 
NSString *s = [NSString stringWithFormat:@"%@%@", s1, s2]; 
// s will be "Hello, world." 

आपके पास + एक स्ट्रिंग कॉन्सटेनेट ऑपरेटर के रूप में साइन नहीं हो सकता है, क्योंकि उद्देश्य-सी में कोई ऑपरेशन ओवरलोडिंग नहीं है।

उम्मीद है कि यह मदद करता है।

+0

कूल, स्पष्ट और सरल स्पष्टीकरण के लिए धन्यवाद। मेरे उदाहरण के लिए, क्या यह प्लेसहोल्डर या स्ट्रिंग कॉन्सटेनेशन के माध्यम से ऐसा करने के लिए बेहतर होगा ("अधिक उद्देश्य-सी-जैसा")? – cksubs

+2

स्ट्रिंग प्रारूप विनिर्देश उद्देश्य-सी ऑब्जेक्ट्स, जैसे कि पूर्णांक ('% i'), युगल ('% f'), सी स्ट्रिंग्स ('% s') आदि के अलावा अन्य प्रकारों को प्रिंट कर सकते हैं। आप इसे concatenation ऑपरेटरों के साथ नहीं कर सकते हैं। स्ट्रिंग प्रारूप विनिर्देशक सी से आते हैं, और आउटपुट के लिए 'printf()' जैसे कार्यों में उपयोग किए जाते हैं। '% @' वाक्यविन्यास मौजूदा सी स्ट्रिंग प्रारूप विनिर्देशों के लिए एक उद्देश्य-सी जोड़ है जो उद्देश्य-सी ऑब्जेक्ट की 'डिस्क्रिप्शन' विधि के आउटपुट को प्रिंट करता है। –

+0

मैं व्यक्तिगत रूप से प्लेसहोल्डर का उपयोग करता हूं। लेकिन यदि आप स्ट्रिंग कॉन्सटेनेशन के साथ ऐसा करते हैं तो यह गलत नहीं है ... :-) –

4

यह string format specifier है। असल में यह आपको स्ट्रिंग में प्लेसहोल्डर और प्लेसहोल्डर के स्थान में डाले जाने वाले मान निर्दिष्ट करने की अनुमति देता है। ऊपर दिए गए लिंक में प्लेसहोल्डर्स और प्रत्येक प्लेसहोल्डर के विशिष्ट प्रारूप के लिए अलग-अलग नोटेशन सूचीबद्ध हैं।

यह सिर्फ सी # के String.Format विधि है:

NSLog(String.Format("My home folder is at '{0}'", absolutePath)); 
2

आप संयोजन करने के लिए NSString +stringWithFormat उपयोग कर सकते हैं: "% @" के लिए

 
NSString* a = // ... 
NSString* b = // ... 
NSString* a_concatenated_with_b = [NSString stringWithFormat:@"%@%@",a,b]; 

कारण यह है कि स्ट्रिंग स्वरूपण के आधार पर और printf format strings syntax फैली है। ये फ़ंक्शन तर्कों की एक परिवर्तनीय संख्या लेते हैं, और प्रतिशत चिह्न (%) से शुरू होने वाली किसी भी चीज़ को प्लेसहोल्डर के रूप में व्याख्या किया जाता है। बाद के वर्ण स्थान धारक के प्रकार का निर्धारण करते हैं।मानक printf "% @" का उपयोग नहीं करता है, और चूंकि "@" आमतौर पर उन चीज़ों के लिए उपयोग किया जाता है जो उद्देश्य-सी सी भाषा में जोड़ता है, यह समझ में आता है कि "@" "उद्देश्य-वस्तु" ।

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

0

इसके अलावा, %@ काफी बहुमुखी है, क्योंकि यह वास्तव में परिणाम स्ट्रिंग में तर्क की वर्णन विधि के परिणाम को सम्मिलित करता है। एनएसएसटींग के लिए, यह स्ट्रिंग का मूल्य है, अन्य वर्ग उपयोगी ओवरराइड प्रदान कर सकते हैं। जावा में toString के समान, उदाहरण के लिए।

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