通过NSArray而不使用循环而是使用游标?

时间:2014-03-10 15:57:16

标签: ios objective-c arrays for-loop

我的NSArray内有对象(CLLocation)。我里面可以有50,100,300或更多的物体。实际上,这个数组是在用户行走时使用并且可以遵循方向。但是用户可以从NSArray的中间开始,你知道我的意思吗?

好吧,我必须一直循环我的数组,以了解我的用户与我的数组中的位置进行比较。

我的问题是:是否可以在列表中使用带有“光标”的Java之类的东西,并简单地调用“下一个对象”来在我的数组中而不是循环中传播?

因为我需要用户在我的阵列的所有位置上行走。 例如:

  1. 我的阵列数:100
  2. 用户从索引34(找到的最近位置)的位置开始
  3. 用户必须执行35,36,37 ... 100和0,1,2,3 ...直到33。
  4. 希望很清楚,如果不使用for循环我真的不知道如何做到这一点......

    感谢您的帮助和建议!

    此致 Lapinou。

5 个答案:

答案 0 :(得分:2)

看起来您想使用NSEnumerator

NSEnumerator Class Reference

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];
}