Почему мой цикл 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
Ответ 3
Лучший способ - использовать шаг, как показано на этой странице документации: Общая функция шаг (от: до: мимо :)
for я in stride(from: 10, through: 5, by: -1) { print(i) }
и шаг за шагом, если вы хотите включить lowerBound: Generic Function stepde (from: through: by :)