Вы можете получить любое другое нечетное число за один раз, и более эффективно, таким образом:
func alternatingOdd(from start: Int, to end: Int) -> [Int] {
guard start >= 0 else { return [] }
let oddStart = (start % 2 == 0 ? 1 : 0) + start
return Array(stride(from: oddStart, through: end, by: 4))
}
alternatingOdd(from: 1, to: 25) //[1, 5, 9, 13, 17, 21, 25]
Вы даже можете изменить количество нечетных чисел, которое вы бы сбросили:
func alternatingOdd(from start: Int, to end: Int, every step: Int) -> [Int] {
guard start >= 0, step > 0 else { return [] }
let oddStart = (start % 2 == 0 ? 1 : 0) + start
return Array(stride(from: oddStart, through: end, by: 2 * step))
}
alternatingOdd(from: 1, to: 25, every: 2) //[1, 5, 9, 13, 17, 21, 25]
alternatingOdd(from: 1, to: 25, every: 3) //[1, 7, 13, 19, 25]
Для диапазонов, начинающихся с отрицательного числа, вы можете вернуть только положительные нечетные числа, если они есть, таким образом:
func alternatingOdd(from start: Int, to end: Int, every step: Int) -> [Int] {
guard step > 0 else { return [] }
let oddStart = max((start % 2 == 0 ? 1 : 0) + start, 1)
return Array(stride(from: oddStart, through: end, by: 2 * step))
}
alternatingOdd(from: -3, to: 10, every: 2) //[1, 5, 9]
alternatingOdd(from: -3, to: 25, every: 4) //[1, 9, 17, 25]