Почему мой цикл Swift с ошибкой "Не удается сформировать диапазон с end <start"?

У меня есть цикл for, который проверяет, является ли число фактором числа, затем проверяет, является ли этот коэффициент простым, а затем добавляет его в массив. В зависимости от исходного числа, я получаю сообщение об ошибке

фатальная ошибка: невозможно сформировать диапазон с концом < старт

Это происходит почти каждый раз, но для некоторых чисел он отлично работает. Единственными числами, которые я нашел для работы с ними, являются 9, 15 и 25.

Вот код:

let num = 16 // or any Int
var primes = [Int]()

for i in 2...(num/2) {

    if ((num % i) == 0) {
        var isPrimeFactor = true

        for l in 2...i-1 {
            if ((i%l) == 0) {
                isPrimeFactor = false;
            }//end if
        }//end for

        if (isPrimeFactor == true) {
            primes.append(i)
        }//end if

    }//end if

}//end for

Ответы

Ответ 1

Если вам нужен цикл с динамическим диапазоном значений, я предлагаю использовать stride(to:by:) вместо ..< или ...

В основном ..< или ... будет сбой, если start_index > end_index.

Пример:

let k = 5
for i in 10...k { print("i=\(i)") }
for i in 10..<k { print("i=\(i)") }

Как исправить:

// swift 2.3
let k = 5
for i in 10.stride(to: k+1, by: 1) { print("i=\(i)") }
for i in 10.stride(to: k, by: 1) { print("i=\(i)") }

// swift 3.0
let k = 5
for i in stride(from: 10, through: k, by: 1) { print("i=\(i)") }
for i in stride(from: 10, to: k, by: 1) { print("i=\(i)") }

ПРИМЕЧАНИЕ: 2 блока выше ничего не распечатают, но один из них потерпит крах при выполнении. Если вы хотите перейти от большего числа к меньшему, то параметр by необходимо изменить на отрицательное число.

Ссылка:

Ответ 2

В вашем втором цикле i всегда начинается с 2, что означает, что вы выполняете цикл из 2...1