Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa/Objective-C-如何单步遍历数组?_Objective C_Arrays_Cocoa_Loops - Fatal编程技术网

Cocoa/Objective-C-如何单步遍历数组?

Cocoa/Objective-C-如何单步遍历数组?,objective-c,arrays,cocoa,loops,Objective C,Arrays,Cocoa,Loops,不确定我的措辞是否正确,但我需要做的是按2、3或4个索引顺序迭代数组 所以你可以像这样遍历一个数组 for(id arrayObject in NSArray) { //do something amazing with arrayObject } 它将依次遍历每个索引对象,[NSArray objectAtIndex:0]、[NSArray objectAtIndex:1]等 那么如果我只想要对象0,4,8,12等等呢 谢谢,不太好。按照您编写它的方式,您省略了arrayObjec

不确定我的措辞是否正确,但我需要做的是按2、3或4个索引顺序迭代数组

所以你可以像这样遍历一个数组

for(id arrayObject in NSArray) { 
    //do something amazing with arrayObject
}
它将依次遍历每个索引对象,[NSArray objectAtIndex:0]、[NSArray objectAtIndex:1]等

那么如果我只想要对象0,4,8,12等等呢


谢谢,不太好。按照您编写它的方式,您省略了
arrayObject
的类,并且您正在迭代
NSArray
类名,而不是一个实例。因此:

for (id arrayObject in myArray) {
    // do stuff with arrayObject
}
其中
myArray
属于
NSArray
NSMutableArray
类型

例如,
NSString
s的数组

for (NSString *arrayObject in myArray) { /* ... */ }
如果要跳过数组的某些部分,则必须使用计数器

for (int i=0; i< [myArray count]; i+=4) {
    id arrayObject = [myArray objectAtIndex:i]; 
    // do something with arrayObject
}
for(int i=0;i<[myArray count];i+=4){
id arrayObject=[myArray objectAtIndex:i];
//用arrayObject做点什么
}
您可以使用并检查块内的索引:

[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if( 0 == idx % 3 ){
        // Do work
    }
    else{
        // Continue enumeration
        return;
    }
}];

这还允许您对数组的非基于跨步的选择进行操作,如果出于某种原因需要,例如,
如果((0==idx%3)| |(0==idx%5))
,这对于普通的
for
循环来说要困难得多。

我想补充一点,您也可以使用基于块的枚举方法

NSMutableArray *evenArray = [NSMutableArray array];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (idx % 4 == 0) 
        [evenArray addObject:obj];
}];
现在,
evenArray
将在原始数组中包含索引为0,4,8…的对象

但是人们通常只希望在原始数组中包含过滤后的对象,而不需要额外的可变数组

我编写了一些基于块的便捷方法来实现这一点:

array = [array arrayByPerformingBlock:^id(id element) {
    return element;
} ifElementPassesTest:^BOOL(id element) {
    return [array indexOfObject:element]%4 == 0;
}];
这将得到相同的结果,但隐藏了创建和填充可变数组的样板代码


您将找到我的。

您可以使用N分子:

NSEnumerator *arrayEnum = [myArray objectEnumerator]; //Or reverseObjectEnumerator
for (MyThingy *thingy in arrayEnum) {
    doThingyWithThingy(thingy);

    [arrayEnum nextObject]; //Skip element
}
您可以在任一点上拥有零条或多条
nextObject
消息。对于每三个对象,在循环的末尾将有两个
nextObject
s:

for (MyThingy *thingy in arrayEnum) {
    doThingyWithThingy(thingy);

    //Skip two elements
    [arrayEnum nextObject];
    [arrayEnum nextObject];
}
基本上,这与通过循环在一次过程中收集多个对象的方式相同,只是没有实际使用其他对象

您还可以在循环之前有零条或多条
nextObject
消息,以便在您想要的第一个对象之前跳过一些对象


(我希望你这样做是为了你所读到的数组,而不是你自己生成的一个数组。后一种情况是你应该考虑从数组操作转移到模型对象。)

对不起,那是一个打印错误,但与我的问题无关。如何以2、3或4的增量而不是1的增量逐步遍历数组等等,你的部分答案一开始没有出现,很奇怪……啊,我知道我的错误在哪里了,我不认为我把它写为+=而是+你不需要在块中调用
indexOfObject:obj
——索引作为
idx
传入。你看到我的答案了吗?不过,到arraytools的链接很好;谢谢。我得承认,我没看到你的答案。几个小时前,当我的笔记本电脑电池用完时,我开始写我的答案。在家里我刚做完。你想让我删除那部分吗?不,不,那是完全不必要的;这只是一时的烦恼和困惑,因为我真的不明白你(清楚你在做什么)为什么要使用
indexOfObject:
很抱歉明显的攻击性。在几个小时内写一个答案可能不是一个好主意。@joshcas正如我在你的个人资料中看到的那样,你也是一个Pythonista。我对这个arraytools的最初想法是有一些类似于列表理解的东西。