我的NSArray
内有对象(CLLocation
)。我里面可以有50,100,300或更多的物体。实际上,这个数组是在用户行走时使用并且可以遵循方向。但是用户可以从NSArray
的中间开始,你知道我的意思吗?
好吧,我必须一直循环我的数组,以了解我的用户与我的数组中的位置进行比较。
我的问题是:是否可以在列表中使用带有“光标”的Java之类的东西,并简单地调用“下一个对象”来在我的数组中而不是循环中传播?
因为我需要用户在我的阵列的所有位置上行走。 例如:
希望很清楚,如果不使用for循环我真的不知道如何做到这一点......
感谢您的帮助和建议!
此致 Lapinou。
答案 0 :(得分:2)
看起来您想使用NSEnumerator
NSArray *anArray = // ... ;
NSEnumerator *enumerator = [anArray objectEnumerator];
id object;
while ((object = [enumerator nextObject])) {
// do something with object...
}
答案 1 :(得分:2)
这是一种方式:
NSArray * arr = ... yourArray
int index = [arr indexOfObject:currentLocation];
index ++;
if (index == arr.count) index = 0;
id nextLocation = arr[index];
另一种可能是创建一个存储当前位置的全局计数器变量。如果这些需要在用户关闭应用程序后持续,您可以将其写入用户默认值
答案 2 :(得分:2)
试试这个:
@interface ArrayEnumerator : NSEnumerator
{
NSArray* array;
NSInteger index;
NSInteger startIndex;
BOOL over;
}
- (id)initWithArray:(NSArray*)anArray
atIndex:(NSInteger)anIndex;
@end
@implementation ArrayEnumerator
- (id)initWithArray:(NSArray*)anArray
atIndex:(NSInteger)anIndex
{
if (self=[super init]) {
array = anArray;
index = anIndex;
startIndex = anIndex;
over = NO;
}
return self;
}
- (id)nextObject
{
if (index == [array count]) {
index = 0;
over = YES;
}
if (over && index == startIndex)
return nil;
return array[index++];
}
- (NSArray*)allObjects
{
return array;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
NSArray* array = @[@0,@1,@2,@3,@4,@5,@6,@7,@8,@9];
id element;
ArrayEnumerator* enumerator = [[ArrayEnumerator alloc] initWithArray:array atIndex:4];
while (element = [enumerator nextObject])
NSLog(@"%@", element);
}
@end
答案 3 :(得分:1)
您可以按索引访问数组元素:
CLLocation * myLocation = myArray[34];
(或)
int i = 34;
CLLocation * myLocation = myArray[i];
答案 4 :(得分:1)
for循环有什么问题? 迭代器通常用在列表上,因为您无法通过索引访问列表中的元素。但是,您正在使用数组,因此您不需要迭代器,而是需要一些以所需顺序访问数组的聪明方法。 也许这段代码可以为您提供一些想法。这将从34到100,然后从0开始,最多到33。
for (int i = 34; i < 134; i++)
{
int ix = i % 100;
id whatever = arr[ix];
}