2013-01-07 22 views
10

मैं NSString के भीतर +[NSString stringWithFormat:] के साथ सदस्यों की श्रेणियां प्राप्त करना चाहता हूं। उद्देश्य-सी प्रारूप स्ट्रिंग को पार्स करने का सबसे अच्छा तरीका क्या है? मैं %@ की वजह से केवल एक सी प्रारूप स्ट्रिंग पार्सर का उपयोग नहीं कर सकता। मैं आदर्श रूप चाहेंगे निम्नलिखित NSArray,, %1$d, %[email protected], आदिपार्स उद्देश्य-सी printf प्रारूप स्ट्रिंग्स?

उदाहरण के लिए [NSString stringWithFormat:@"foo %[email protected] bar %[email protected]", @"Heath", @"Borders"] के साथ बनाया गया तार के साथ: @[NSMakeRange(15, 5), NSMakeRange(4, 6)] मैं भी यकीन है कि यह समर्थन करता है प्रारूप orderings बनाने की जरूरत है। पहली सरणी वस्तु प्रारूप स्ट्रिंग में पहले डेटा तत्व से मेल खाती है, दूसरे डेटा तत्व के लिए दूसरी सरणी वस्तु, आदि

इस मामले में, एपीआई कुछ + (NSString *) stringWithFormatRanges:(NSArray **)outFormatRanges withFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2); कैसा दिखेगा यह एक NSString सिर्फ +[NSString stringWithFormat:] की तरह वापसी होगी , लेकिन यह प्रत्येक प्रारूप डेटा तत्व के NSRange एस के साथ NSArray भी वापस करेगा।

- संपादित करें -

यह देखते हुए कि इस सवाल का 3 साल पुराना है, मैं इस बिंदु पर एक सी ही कार्यान्वयन के साथ खुशी होगी।

+0

पार्सिंग कैसे, आपकी सटीक आवश्यकता क्या है ... कृपया समझाएं। –

+3

"सदस्यों की श्रेणियों" से आपका क्या मतलब है? क्या आप कह रहे हैं कि आप "% @", "% 1 $ d" और "% 2 $ @" जैसे सबस्ट्रिंग के लिए पार्स करना चाहते हैं? – trudyscousin

+0

मुझे लगता है कि आप पहली बार आरईएस के साथ अलग-अलग प्रारूप आइटम निकाल देंगे, फिर उनका निरीक्षण करने और उन्हें वर्गीकृत करने के लिए कोड लिखें। –

उत्तर

5

मैंने कुछ साल पहले इसमें देखा था। अगर मैं आपके प्रश्न को समझता हूं, तो सी या कोको प्रारूप तारों के लिए प्रारूप स्ट्रिंग से एएसटी प्राप्त करने का कोई आसान तरीका नहीं है।

मैंने NSXMLElement + elementWithXMLFormat लिखा जो एनएसएक्सएमएलमेंट्स के एक विशेष %%%@ प्रारूप कोड के साथ प्रारूप स्ट्रिंग में अनसुलझे सम्मिलित होने की अनुमति देता है, जिसके लिए कोको के प्रारूप को विस्तारित करने की आवश्यकता होती है। मेरे तकनीक आपके लिए उपयोगी साबित हो सकता है:

https://github.com/rentzsch/nsxmlelement-elementwithxmlformat/blob/937b54b2a830a8fbbd72d6bc5e48bafd495ddcbd/NSXMLElement%2BelementWithXMLFormat.m#L41

मैं निकालने और NUL-परिसीमित सिर्फ प्रारूप कोड, पारंपरिक रूप से के माध्यम से इसे चलाने और उसके बाद पुनः।

+0

धन्यवाद! मैं आज रात देख लूंगा। यह आशाजनक लग रहा है। –

3

मैं स्विफ्ट में उन लोगों के लिए एक पार्सर लिखा था मेरी उपकरण के लिए (ताकि मैं Localizable.strings में उन प्लेसहोल्डर और निकालने जो प्रकार जब उन तार के साथ stringWithFormat: बुला दिए जाने की उम्मीद की गई थी पता लगा सकते हैं) SwiftGen

आप देख सकते हैं कोडिंग का हिस्सा पार्सिंग there on my GitHub कर रहा है।

  • निश्चित रूप से, यह स्विफ्ट में है और उद्देश्य-सी नहीं है, लेकिन मुझे लगता है कि यह ओबीजेसी के लिए आसानी से अनुवाद योग्य है, जब तक आप एल्गोरिदम का तर्क रखते हैं।
  • मेरा कोड श्रेणीओं को या तो उन कार्यों के आउटपुट के रूप में वापस नहीं करता है - केवल प्रकार - लेकिन typesFromFormatString फ़ंक्शंस में कोड निश्चित रूप से उन प्लेसहोल्डर्स की सीमा तक पहुंच प्राप्त करता है और उन्हें पूरी तरह से पता लगाए गए प्रकार के अतिरिक्त वापस कर सकता है (कि एक आसान परिवर्तन है, मैं तो बस इसलिए मैं उन्हें वापसी प्रकार में शामिल नहीं किया था)

उन सीमाओं जरूरत नहीं थी (एक बार जब आप %d या %[email protected] तरह प्लेसहोल्डर के लिए सीमाएं हों, तो यह हो जाएगा स्ट्रिंग पैरामीटर के लिए श्रेणियों को कम करना आसान है: पहली श्रेणी में पहले प्लेसहोल्डर के रूप में .location होगा लेकिन प्रतिस्थापित मूल्य की लंबाई, दूसरी श्रेणी में 01 होगा ऑफसेट को खाते में लेने के लिए दूसरे प्लेसहोल्डर + (firstValue.length- firstRange.length) के)

एचटीएच।