7

NSRange次のような年の範囲を保持するために使用しようとしています

NSRange years = NSMakeRange(2011, 5);

主にフィルタリングに使用されることはわかってNSRangeいますが、範囲内の要素をループしたいと考えています。NSRangeを に変換せずにそれは可能NSArrayですか?

4

4 に答える 4

8

NSRangePythonrangeオブジェクトのようになることを期待しているように思えます。そうではありません; NSRange単なる構造体です

typedef struct _NSRange {
       NSUInteger location;
       NSUInteger length;
} NSRange;

オブジェクトではありません。作成したら、そのメンバーを単純な古いforループで使用できます。

NSUInteger year;
for(year = years.location; year < NSMaxRange(years); year++ ){
    // Do your thing.
}

(まだ Python について考えているという前提で作業しています。) Python ループに心地よく似ている、の内容を反復処理するための高速列挙と呼ばれる構文が ObjC にありますが、リテラルおよびプリミティブな数値を入力できないためです。 anからCocoa 配列に直接移動することはできません。NSArrayforNSArrayNSRange

ただし、カテゴリを使用するとそれが簡単になります。

@implementation NSArray (WSSRangeArray)

+ (id)WSSArrayWithNumbersInRange:(NSRange)range
{
    NSMutableArray * arr = [NSMutableArray array];
    NSUInteger i;
    for( i = range.location; i < NSMaxRange(range); i++ ){
        [arr addObject:[NSNumber numberWithUnsignedInteger:i]];
    }

    return arr;
}

次に、配列を作成して高速列挙を使用できます。

NSArray * years = [NSArray WSSArrayWithNumbersInRange:NSMakeRange(2011, 5)];
for( NSNumber * yearNum in years ){
    NSUInteger year = [yearNum unsignedIntegerValue];
    // and so on...
}
于 2011-11-30T04:10:29.253 に答える
6

NSRange は、範囲の開始と長さを表す 2 つの整数を保持する構造体であることを思い出してください。for ループを使用して、含まれているすべての整数を簡単にループできます。

NSRange years = NSMakeRange(2011, 5);
NSUInteger year;
for(year = years.location; year < years.location + years.length; ++year) {
    // Use the year variable here
}
于 2011-11-30T04:09:01.967 に答える