6

私は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

4 に答える 4

10

パーティーに遅れて来るが、以下はうまくいき、私が信じる範囲を利用するだろう:

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

などなど。

于 2013-01-10T15:42:43.390 に答える
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を使用する必要はありません。

于 2010-11-09T22:02:15.953 に答える
0

範囲には場所と長さが必要です。したがって、東部の範囲で80〜100度が必要な場合は、NSMakeRange(80、20)を使用できます。これにより、80度から始まり、20度に及ぶ範囲が作成されます。

于 2010-11-09T22:01:47.063 に答える
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;
于 2014-02-04T17:46:58.247 に答える