考虑一个循环。我也对快速枚举感兴趣。所以,它可能是
- 要么是
for(id obj in objects)
- 或
[objects enumerate... ]
我想知道是否有一种经典或好的方法(Objective-C
)来区分循环的第一个元素和其他元素。当然,如果只有一种很好的方法来区分最后一个元素和其他元素,我也感兴趣。
有没有一种经典或好的方法将不同的指令应用于循环的第一个或最后一个元素?
使用经典的 for
循环最简单,但由于您想要快速枚举,因此需要自己的计数器:
NSUInteger index = 0;
NSUInteger count = objects.count;
for (id obj in objects) {
if (index == 0) {
// first
} else if (index == count - 1) {
// last
} else {
// all others
}
index++;
}
如果objects
是NSArray
,您可以执行以下操作:
[objects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (idx == 0) {
// first
} else if (idx == objects.count - 1) {
// last
} else {
// all others
}
}];
不确定 nice 是什么意思,所以我的想法是:
[array.firstObject doSomethingWithFirst]; // iOS 7 SDK or custom category
NSRange range = NSMakeRange(1, array.count - 2); //TODO: Check for short arrays.
for (id object in [array subarrayWithRange:range]) {
[object doSomething];
}
[array.lastObject doSomethingWithLast];
它做你想要的,你不会费心计算索引,使用快速枚举,它是可读的(第一个和最后一个)。唯一奇怪的是NSRange
部分。
你可能会认为这很好。
如果你使用 FOR 的通用语句,你可以这样做:
for (int i = 0; i < [myArray count]; i++)
{
if(i == 0)
NSLog("First");
if(i == [myArray count] - 1)
NSLog("Last");
//rest of your code
}
即使我建议使用这些 NSArray 方法:-
- (void)enumerateObjectsUsingBlock:(void (^)
(id obj, NSUInteger idx, BOOL *stop))block
请记住,枚举对象使用块不保证以有序方式循环。您可能正在寻找的经典示例:
const NSInteger sizeOfArray = 10;
NSInteger numbers[sizeOfArray] = {10,20,30,40,50,60,70,80,90,100};
NSInteger i = 0;
do {
switch (i) {
case 0:
NSLog(@"First");
break;
case sizeOfArray:
NSLog(@"Last");
break;
default:
NSLog(@"All others");
break;
}
NSLog(@"Number = %i", numbers[i++]);
}while (i < sizeOfArray);