私はこの NSArray を持っています:
NSArray* temp=[[NSArray alloc]
initWithObjects:@"one",@"five",@"two",nil];
for(NSString* obj in temp){
NSLog(@"current item:%@ Next item is:%@",obj, ***blank***);
}
何を交換する必要がありblank
ますか? 今後のオブジェクトを知る必要がありますか?
私はこの NSArray を持っています:
NSArray* temp=[[NSArray alloc]
initWithObjects:@"one",@"five",@"two",nil];
for(NSString* obj in temp){
NSLog(@"current item:%@ Next item is:%@",obj, ***blank***);
}
何を交換する必要がありblank
ますか? 今後のオブジェクトを知る必要がありますか?
これは、オブジェクトが一意である場合(つまり、配列に同一のオブジェクトがない場合)にのみ機能します。
id nxt = nil;
int nxtIdx = [temp indexOfObject:idx] + 1;
if (nxtIdx < temp.count) {
nxt = [temp objectAtIndex:nxtIdx];
}
NSLog(@"current item:%@ Next item is:%@", obj, nxt);
しかし、私の意見では、これはハックです。オブジェクトのインデックスで通常のforループを使用しないのはなぜですか。
for (int i = 0; i < temp.count; i++) {
id obj = [temp objectAtIndex:i];
id next = (i + 1 < temp.count) ? [temp objectAtIndex:i + 1] : nil;
}
または(推奨)ブロックを使用して列挙します
[temp enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
id next = nil;
if (idx + 1 < temp.count) {
next = [temp objectAtIndex:idx + 1];
}
}];
を使用してみてくださいNSEnumerator
。
コード:
NSEnumerator *enumerator = [temp objectEnumerator];
id obj;
while (obj = [enumerator nextObject]) {
if ([enumerator nextObject] == nil) {
NSLog(@"This is the last object: %@", obj);
break;
}
NSLog(@"current item:%@ Next item is:%@", obj, [enumerator nextObject]);
}
数行の余分なコード (インデックスの導出、インデックスへの追加、境界内のチェック) なしでは高速な列挙ではこれを行うことはできません。
ブロックを使用して列挙し、idx
パラメーターに追加することもできますが、より良い設計 (危険を冒したり、範囲外の例外をチェックする必要がない場合) は、代わりに前のオブジェクトを記憶することです。これは最初のオブジェクトでは nil になります。反復。
現在のオブジェクトのインデックスを取得し、次のようなもので次を見ることができます。
NSArray* temp=[[NSArray alloc] initWithObjects:@"one",@"five",@"two",nil];
for(NSString* obj in temp){
if([temp count] < [temp indexOfObject:obj]+1)
{
NSLog(@"current item:%@ Next item is:%@",obj, [temp objectAtIndex:[temp indexOfObject:obj] + 1]);
}
}
私にとっては、この場合、従来の for ループを実行してインデックス変数にアクセスする方が簡単な場合があります。
高速列挙を使用する場合、これが唯一の方法です。
NSInteger index = [temp indexOfObject:obj];
if (index != NSNotFound && index < temp.count)
NSObject nextObject = [temp objectAtIndex:(index + 1)];
有効なインデックスを取得する必要があり、それにインデックスを追加しても範囲外にならないことに注意してください。