Как я могу использовать NSRange с целыми числами, чтобы упростить мой код? - PullRequest
6 голосов
/ 10 ноября 2010

Я только начал изучать Objective-C и создал небольшое приложение для компаса, которое будет отображать направление, когда оно попадает в диапазон заголовков. Это работает просто отлично, но мне интересно, есть ли более краткий способ написать это, используя 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:@"-"];

}

Ответы [ 4 ]

9 голосов
/ 10 января 2013

Опоздание на вечеринку, но следующее будет работать и использовать диапазоны, я считаю:

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.");
}

и т. Д.и т.д.

3 голосов
/ 10 ноября 2010

я делаю это более многословным, чем нужно?

Да.Если вы хотите выполнять числовые операции, избегайте NSNumber.Класс NSNumber существует только потому, что коллекции Objective C, такие как NSArray, NSDictionary и т. Д., Могут содержать только объекты Objective C.В противном случае вы всегда должны использовать обычный 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.

0 голосов
/ 04 февраля 2014

Если вы хотите более интегрированного использования структуры NSRange, я нашел ее полезной для сравнения частей массивов:

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;
0 голосов
/ 10 ноября 2010

Диапазон занимает местоположение и длину.Поэтому, если вы хотите от 80 до 100 градусов для восточного диапазона, вы можете использовать NSMakeRange (80, 20).Это создаст диапазон, начинающийся с 80 градусов и охватывающий 20 градусов.

...