Создайте функцию для итерации и цикла по массиву в Swift

Я пытаюсь создать функцию в Xcode, которую я могу вызывать каждый раз, когда я нажимаю кнопку для последовательного перебора массива, который затем обновляет значение заголовка кнопки.

Кажется, я не могу решить эту задачу. Я пробовал различные итерации циклов while и операторов if, но каждый раз, когда я его запускаю, я заканчиваю прямо на последнем значении в массиве. Вот код, который у меня есть на данный момент, я попытался добавить предложение break, чтобы остановить автоматическую итерацию функции по всему массиву, но теперь выдает сообщение об ошибке, в котором говорится, что код после оператора return никогда не будет выполнен:

Итак, я создал экземпляр кнопки в моем viewController следующим образом:

@IBAction func repCount() {
    repCountButton.setTitle("\(repCounter.repCount())", forState: UIControlState.Normal)

Я надеюсь, что это затем обновит заголовок кнопки тем, что я возвращаю из функции repCount, которая вызывается каждый раз при нажатии кнопки.

Я настроил функцию в отдельном файле Swift с именем repCounter, и мой код для функции repCount выглядит следующим образом:

var repArray = [1,2,3,4,5]
var repArrayIndex: Int = 0

func repCount () -> String {
    if repArrayIndex < repArray.count {
        while repArrayIndex < repArray.count {
            return "\(repArray[repArrayIndex])"
            break
        }
        repArrayIndex++
    } else {
        return "\(repArray[0])"
    }
}

Я бы хотел, чтобы это было циклически через массив каждый раз, когда он вызывается, и как только он дойдет до конца массива, чтобы снова начать цикл с начала массива.

Заранее благодарю за любую помощь!


person Sean    schedule 04.02.2015    source источник
comment
Вы просто пытаетесь получить строку для текущего индекса?   -  person Ryan Poolos    schedule 04.02.2015
comment
Я думаю, вы должны объяснить, чего вы пытаетесь достичь. Я не знаю, что вы пытаетесь сделать, но обратите внимание, что вы увеличиваете индекс вне цикла while, это то, что вы хотите? И вы никогда не сбрасываете индекс, ожидается ли, что он также перейдет к последнему элементу и останется там?   -  person MirekE    schedule 04.02.2015
comment
Привет, извини - я изучаю программирование всего пару дней, и это мой первый пост! Я обновлю свой вопрос с большим контекстом   -  person Sean    schedule 04.02.2015


Ответы (2)


У меня нет компьютера, где я могу запустить XCode, чтобы протестировать его, но я думаю, что приведенная ниже версия будет делать то, что вы хотите. Это не самый элегантный код, но очень простой. Вы должны выполнить все операции с индексами перед оператором return, так как после того, как код нажмет на возврат, ничего после него выполняться не будет.

Я добавил код для сброса индекса, когда он достигает конца массива.

    var repArray = [1,2,3,4,5]
    var repArrayIndex: Int = 0

    func repCount () -> String {
        while repArrayIndex < repArray.count {
            var curIndex = repArrayIndex
            repArrayIndex = repArrayIndex + 1;
            if repArrayIndex >= repArray.count {
               repArrayIndex = 0
            }
            return "\(repArray[curIndex])"
        }
        return "\(repArray[0])"
    }
person Wayne Tanner    schedule 04.02.2015
comment
Для справки, это не лучший способ сделать это. Глобальные переменные и функции с побочными эффектами — это вообще плохо. Однако без контекста остального кода трудно найти лучшее решение. - person Wayne Tanner; 04.02.2015
comment
Спасибо, Уэйн, похоже, дело почти готово. Кажется, что это хорошо перебирает массив, но как только вы вызвали его 5 раз (счетчик массива), он просто возвращает первое значение в массиве. Я хотел бы, чтобы он продолжал циклически перемещаться по массиву. - person Sean; 04.02.2015
comment
Какая строка цели 12345 ?? - person Leo Dabus; 04.02.2015
comment
Я добавил код, чтобы он продолжал цикл, сбросив индекс. - person Wayne Tanner; 04.02.2015
comment
@WayneTanner, это потрясающе, спасибо - кажется, работает отлично! - person Sean; 04.02.2015

Другой вариант получения этого количества без повторения - сделать

// From Swift 1.2
func repCount () -> String {
    return count(repArray)
}

// Before Swift 1.2
func repCount () -> String {
    return countElements(repArray)
}

Если вы настаиваете на повторении, есть несколько вариантов, см. Перебор массива, который может быть:

var count = 0
for rep in repArray {
   count++
}

Или вы могли бы использовать итерацию туда и обратно, указанную в другом ответе, но зачем делать это сложным путем, когда вам это не нужно? Или вы что-то нам не сказали?

person holroy    schedule 07.03.2015