Cocoa/Objective-C-如何单步遍历数组?
不确定我的措辞是否正确,但我需要做的是按2、3或4个索引顺序迭代数组 所以你可以像这样遍历一个数组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
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的最初想法是有一些类似于列表理解的东西。