2010-11-09 17 views
6

मैंने अभी उद्देश्य-सी सीखना शुरू कर दिया है और थोड़ा कम्पास ऐप बनाया है जो एक दिशा प्रदर्शित करेगा जब यह शीर्षक की एक श्रृंखला में आता है। यह ठीक काम करता है, लेकिन मुझे आश्चर्य है कि NSRange का उपयोग करके इसे लिखने का एक और संक्षिप्त तरीका है या नहीं। बहुत सारे लगने के बाद, ऐसा लगता है कि NSRange संख्याओं की बजाय स्ट्रिंग फ़ंक्शंस के लिए अधिक उपयोग किया जाता है।मैं अपने कोड को सरल बनाने के लिए पूर्णांक के साथ एनएसआरेंज का उपयोग कैसे कर सकता हूं?

मैंने NSRange का एक संक्षिप्त उदाहरण बनाने के लिए अपना प्रारंभिक बिंदु बनाने का प्रयास किया, मैं उस कार्य को ट्रैक नहीं कर सका जो कि NSRange के भीतर कोई संख्या गिरती है।

क्या मैं यहां सही रास्ते पर हूं, या क्या मैं इसे और अधिक वर्बोज़ बनाने की आवश्यकता है?

अग्रिम धन्यवाद ..

यहाँ था मेरी विफल बंद बिंदु ऊपर कोड को छोटा करने के प्रयास करने के लिए कूद:

// If heading falls within this range, then display "S" for south  
NSRange eastenRange = NSMakeRange (80, 100); 
NSRange southernRange = NSMakeRange (170, 190); 
etc... 

यहाँ मेरे वर्तमान कोड है (ठीक काम करता है):

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateHeading:(CLHeading *)newHeading 
{ 
// Define and display the heading 
NSNumber *theHeading = [NSNumber numberWithInt:[newHeading trueHeading]]; 
[headingLabel setText:[NSString stringWithFormat:@"%@°", theHeading]]; 

// Define the range of directions 
NSNumber *northLowerRange = [NSNumber numberWithInt:10]; 
NSNumber *northUpperRange = [NSNumber numberWithInt:350]; 

NSNumber *eastLowerRange = [NSNumber numberWithInt:80]; 
NSNumber *eastUpperRange = [NSNumber numberWithInt:100]; 

NSNumber *southLowerRange = [NSNumber numberWithInt:170]; 
NSNumber *southUpperRange = [NSNumber numberWithInt:190]; 

NSNumber *westLowerRange = [NSNumber numberWithInt:260]; 
NSNumber *westUpperRange = [NSNumber numberWithInt:280]; 


// If the heading falls within the correct ranges, then display the direction 
if ([northLowerRange compare:theHeading] == NSOrderedDescending || [northUpperRange compare:theHeading] == NSOrderedAscending) 
    [directionLabel setText:@"N"]; 
else if ([eastLowerRange compare:theHeading] == NSOrderedAscending && [eastUpperRange compare:theHeading] == NSOrderedDescending) 
    [directionLabel setText:@"E"]; 
else if ([southLowerRange compare:theHeading] == NSOrderedAscending && [southUpperRange compare:theHeading] == NSOrderedDescending) 
    [directionLabel setText:@"S"]; 
else if ([westLowerRange compare:theHeading] == NSOrderedAscending && [westUpperRange compare:theHeading] == NSOrderedDescending) 
    [directionLabel setText:@"W"]; 
else 
    [directionLabel setText:@"-"]; 

} 

उत्तर

3

क्या मैं इसे और अधिक वर्बोज़ बनाने की आवश्यकता है?

हां। जब आप संख्यात्मक परिचालन करना चाहते हैं, तो NSNumber से बचें। एनएसएनंबर वर्ग केवल इसलिए मौजूद है क्योंकि उद्देश्य-सी संग्रह जैसे एनएसएआरएआरई, एनएस डिक्शन आदि केवल उद्देश्य-सी वस्तुओं को पकड़ सकते हैं। अन्यथा, आप कभी सादे का उपयोग करना चाहिए int या NSInteger या CGFloat या double आदि

int heading = [newHeading trueHeading]; 
headingLabel.text = [NSString stringWithFormat:@"%d°", heading]; 

if (10 < heading || heading > 350) 
    directionLabel.text = @"N"; 
else if (80 < heading && heading < 100) 
    directionLabel.text = @"E"; 
// and so on. 

आप NSRange उपयोग करने की आवश्यकता नहीं है।

+1

यह पूर्णांक के बजाय वास्तुकला स्वतंत्र NSInteger और NSUInteger उपयोग करने के लिए कोको और कोको टच में आम तौर पर बेहतर है। – Chuck

+0

@Chuck: ठीक है। लेकिन ओपी '+ numberWithInt: 'का उपयोग करता है, इसलिए मैं कोड में' int' रखता हूं। – kennytm

+0

धन्यवाद, @ केनीटीएम। अब बहुत साफ है। @ चक - ने एनएसयूइंटर पर अपनी टिप ली और इसका भी इस्तेमाल किया। मैंने शुरुआत में नंबर का उपयोग किया था: क्योंकि यह अपवाद नहीं फेंक दिया, इसलिए मैंने इसे रखा। –

0

एक सीमा एक स्थान और लंबाई लेता है। तो यदि आप पूर्वी सीमा के लिए 80 से 100 डिग्री चाहते हैं, तो आप एनएसएमकेरेेंज (80, 20) का उपयोग कर सकते हैं। इससे 20 डिग्री तक फैले 80 डिग्री से शुरू होने वाली रेंज बन जाएगी।

9

पार्टी के लिए देर से आ रहा है, लेकिन निम्नलिखित काम करते हैं और सीमाओं का इस्तेमाल करते हैं जाएगा मेरा मानना ​​है कि:

NSRange easternRange = NSMakeRange (80, 20); 
NSRange southernRange = NSMakeRange (170, 20); 

NSInteger heading = 92; 
if (NSLocationInRange(heading,easternRange)) { 
    NSLog(@"Heading Easterly."); 
} else if (NSLocationInRange(heading,southernRange)) { 
    NSLog(@"Heading southerly."); 
} 

आदि आदि

0

आप NSRange struct का एक और अधिक एकीकृत उपयोग चाहने रहे हैं, तो मैं इसे सरणियों के कुछ भागों की तुलना के लिए उपयोगी पाया है:

NSRange aRange = NSRangeFromString([NSString stringWithFormat:@"{0:%d}",items.count]); 
NSIndexSet* aSet = [NSIndexSet indexSetWithIndexesInRange:aRange]; 
NSIndexSet *hasNotBeenReadSet = [items indexesOfObjectsAtIndexes:aSet 
                  options:NSEnumerationConcurrent 
                 passingTest: 
            ^BOOL(BasicItem* obj, NSUInteger idx, BOOL *stop) { 
            return [obj hasNotBeenRead]; 
            }]; 

int numberOfUnreadItems = hasNotBeenReadSet.count; 

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

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