Делайте что-нибудь каждую n-ю итерацию l oop в Objective- c или Swift - PullRequest
0 голосов
/ 14 июля 2020

Внутри al oop можно делать что-то через раз, используя нечетное и четное и проверяя на четность. Я хотел бы сделать что-то фиксированное количество раз, например четыре, независимо от того, сколько итераций есть в l oop (значение i). Есть ли способ делать что-то каждый n-й раз?

Думаю, должен быть способ увеличить второй счетчик, но у него проблемы с его получением.

A Loop
int i = 0;
int movinglimit = 0;
int incr = [myItems count]/4;;// there might be 10, 20 or 30 items. I only want to do something four times
while (i < [myItems count]) {
    
if ((i % 2) == 0) {
    
//do something if even
}


 if (i>movinglimit) {
        //do something a total of four times
 }
 if (i==moving limit+1) {
            movinglimit = movinglimit + incr;
 }
    i++;
 }

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Предполагая, что myItems - это NSArray, NSMutableArray или NSSet, вы можете применять методы ко всем объектам сразу, что умнее, чем реализация итерационного цикла, проходящего через объект за объектом самостоятельно. Таким образом, вы в полной мере воспользуетесь obj C.

[myItems makeObjectsPerformSelector:@selector(yourObjectMethodToApply)];

Это имеет побочный эффект: ничего выполняется / применяется , если myItems равно nil

Короткий комментарий к вашему псевдокоду. Будьте осторожны с , в то время как зацикливается без каких-либо приращений внутри. Тот, который вы здесь показываете, - это только цикл один раз.

//iteration backward
NSUInteger i = myItems.count-1;
for ( ; i>0; ) {
    if ((i % 2) == 0) {
         // do stuff if 4th is even

    }
    // do stuff on every 4th one

    i-=4; //increment does not have to be in for () declaration
}

определяет сходство (также обратная итерация) с

NSUInteger i = myItems.count-1;
while (i>0) {
    // do stuff on each 4th item

    //check for odd/even
    myItems[i] = i % 2 ? /* even stuff */ : /* odd stuff */;

    i-=4; //decrement i
}
0 голосов
/ 14 июля 2020

Вы отметили Swift, поэтому я предполагаю, что вам нужны ответы Ob- C или Swift. Вы можете перечислить l oop и использовать это перечисление (которое я называю n ниже). Первым перечислением всегда будет 0, поэтому, чтобы упростить четность / нечетность, просто добавьте 1, чтобы сделать первую итерацию 1.

let data = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]

for (n, i) in data.enumerated() {
    if (n+1).isMultiple(of: 2) {
        print(n+1, i) // every even iteration
    }
}

// output: 2 b, 4 d, 6 f, 8 h, 10 j

for (n, i) in data.enumerated() {
    if (n+1) <= (4*2), (n+1).isMultiple(of: 2) {
        print(n+1, i) // every even iteration but only 4 times
    }
}

// output: 2 b, 4 d, 6 f, 8 h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...