是否有一种经典或好的方法将不同的指令应用于循环的第一个或最后一个元素?

时间:2013-10-15 17:30:18

标签: ios objective-c cocoa loops enumeration

考虑一个循环。我也对快速枚举感兴趣。所以,它可能是

  • 要么for(id obj in objects)
  • [objects enumerate... ]

我想知道是否有一种经典或好的方式(在Objective-C中)来区分循环的第一个元素和其他元素。当然,如果只有很好的方法来区分最后的元素和其他元素,我也很感兴趣。

是否有经典或好的方法将不同的指令应用于循环的第一个或最后一个元素?

5 个答案:

答案 0 :(得分:5)

使用经典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++;
}

如果objectsNSArray,您可以执行以下操作:

[objects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (idx == 0) {
        // first
    } else if (idx == objects.count - 1) {
        // last
    } else {
        // all others
    }
}];

答案 1 :(得分:1)

不确定 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部分。

你可以认为很好

答案 2 :(得分:0)

如果您使用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
}

答案 3 :(得分:0)

即使我建议使用这些NSArray方法: -

 - (void)enumerateObjectsUsingBlock:(void (^)
   (id obj, NSUInteger idx, BOOL *stop))block

答案 4 :(得分:0)

请记住,enumerateObjectsUsingBlock不保证以有序方式循环。您可能正在寻找的经典示例:

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);