我刚开始学习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:@"-"];
}
答案 0 :(得分: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.");
}
等。等
答案 1 :(得分:3)
我是否让它比它需要的更冗长?
是。如果要进行数值运算,请避免使用NSNumber。 NSNumber类的存在只是因为像NSArray,NSDictionary等的Objective-C集合只能保存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。
答案 2 :(得分:0)
范围需要一个位置和一个长度。因此,如果你想要一个东部范围80到100度,你可以使用NSMakeRange(80,20)。这将创建一个范围从80度开始,跨越20度。
答案 3 :(得分:0)
如果您想要更集成地使用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;