2012-10-10 16 views
13

मैं अपने किसी एक ऐप में कुछ पुराने कोड के माध्यम से जा रहा हूं और उन क्षेत्रों में कोड को ठीक कर रहा हूं जो संभावित रूप से समस्याग्रस्त हो सकते हैं।एनएसआरेंज: रेंज.लोकेशन! = एनएस नॉटफाउंड बनाम रेंज। लम्बाई> 0

मैं का उपयोग कर पुराने कोड का एक बहुत दिखाई दे रही है ...

NSRange range = //determine range here.... 
if(range.length > 0) 
{ 
    //do stuff 
} 

कि कोड "ठीक" है, या मैं इसे इस को बदलना चाहिए?

NSRange range = //determine range here.... 
if(range.location != NSNotFound) 
{ 
    //do stuff 
} 

क्या ये दो विधियां समान, अनिवार्य रूप से हैं या नहीं?

उत्तर

12

दो चेक हमेशा समान नहीं होते हैं। यह इस बात पर निर्भर करता है कि सीमा कैसे उत्पन्न हुई थी। उदाहरण:

NSRegularExpression *re = [NSRegularExpression 
    regularExpressionWithPattern:@"(?=)" options:0 error:NULL]; 
NSTextCheckingResult *result = [re firstMatchInString:@"hello world" 
    options:0 range:NSMakeRange(0, 11)]; 
NSLog(@"range = %@", NSStringFromRange(result.range)); 

रेंज की दूरी 0 है, लेकिन इसके स्थान 5, नहीं NSNotFound है।

+0

सिद्धांत के लिए दिलचस्प काउंटर उदाहरण है कि NSNotFound और लंबाई> 0 के बराबर स्थान की जांच करना अनिवार्य रूप से वही है ... – MikeS

+1

यहां एक संदर्भ के लिए 'NSRegularExpressions'' के लिए प्रलेखन क्या कहना है: _ अगर परिणाम लौटाया गया है तो शून्य-शून्य है, तो [परिणाम सीमा] हमेशा वैध सीमा होगी, इसलिए इसे {NSNotFound, 0 के विरुद्ध तुलना करना आवश्यक नहीं है }। हालांकि, कुछ नियमित अभिव्यक्तियों के लिए (हालांकि उदाहरण पैटर्न नहीं) कुछ कैप्चर समूह किसी दिए गए मैच में भाग ले सकते हैं या नहीं भी हो सकते हैं। यदि किसी दिए गए कैप्चर समूह किसी दिए गए मैच में भाग नहीं लेता है, तो [परिणाम श्रेणी एट इंडेक्स: आईडीएक्स] {NSNotFound, 0} ._ – Joe

0

NSNotFound को "NSIntegerMax" के रूप में परिभाषित किया गया है। भले ही वे एक ही परिणाम उत्पन्न करते हैं, आपका दूसरा प्रदर्शन कहीं अधिक पठनीय और स्वयं दस्तावेज है। हो सकता है कि आपको उन सभी को नहीं ढूंढना चाहिए और उन्हें बदलना चाहिए, लेकिन आगे बढ़ने के लिए स्विच करें।

+0

तो कार्यान्वयन में, वे समान हैं, लेकिन पसंदीदा उपयोग सीमा की जांच कर रहा है। स्थान एनएसएनओटीएफउंड के बराबर है या नहीं? – MikeS

+0

मुझे लगता है कि हम अब शैली के बारे में बात कर रहे हैं क्योंकि मेरा मानना ​​है कि दोनों आपको एक ही परिणाम देंगे। मैं बस सोचूंगा कि यदि आप दूसरे को पढ़ते हैं तो यह बहता है और समझता है कि "श्रेणी का स्थान पाया जाता है या नहीं मिला" जैसा कि पहले के विपरीत है जिसे व्याख्या की आवश्यकता होती है। किसी भी तरह से यह बहुत मामूली मामूली है और आप पूरी फाइल के लिए स्थिरता के लिए सिर्फ एक सम्मेलन चुन सकते हैं। – rooster117

5

उत्तर आपके द्वारा उपयोग किए जा रहे फ़ंक्शन/विधि पर निर्भर करता है। NSRange केवल एक संरचना है इसलिए आपको जिस फ़ंक्शन/विधि को कॉल कर रहे हैं, उसके लिए आपको दस्तावेज़ को पढ़ने की आवश्यकता है।

उदाहरण:

NSRangeFromString
एक टेक्स्ट का प्रतिनिधित्व से एक सीमा देता है।

... aString किसी भी पूर्णांक नहीं है, तो, इस समारोह एक NSRange struct, जिनके स्थान और लंबाई मूल्यों दोनों 0.

हैं इस मामले NSNotFound कार्य नहीं करेगा के लिए जाँच में वापस आती है।


-[NSString rangeOfString:]

... रिटर्न {NSNotFound, 0} aString नहीं मिली या रिक्त ("@") है जाता है।

यहाँ यह NSNotFound के खिलाफ जांच करने की अनुशंसा स्थान, दस्तावेज उस स्थान NSNotFound हो जाएगा और length तो चेक की या तो काम करेगा 0 हो जाएगा, लेकिन मैं होता है।

+0

वापस आ जाएगा, तो ऐसा लगता है कि मेरे प्रश्न में वास्तव में क्या मायने रखता है यह है कि सीमा कैसे निर्धारित की जाती है और मैं ' मैं सीमा के साथ करने की कोशिश कर रहा हूँ। – MikeS

+0

हां, यह निर्धारित करने के लिए कि आपको क्या जांचना है, दस्तावेज़ीकरण पढ़ें। – Joe

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

  • कोई संबंधित समस्या नहीं^_^