Ваша программа падает, потому что вы не можете индексировать пустой массив в Swift.Вы должны использовать append
для добавления элементов в ваш массив.
Вместо создания массива путем добавления элементов, это идеальное место для использования map
:
func primeList(maxP: Int) -> [(num1: Int, num2: Bool)] {
return (1...maxP).map { ($0, primecheck(numbers: $0)) }
}
Объяснение:
map
создает массив.В этом случае он берет каждый элемент из диапазона (1...maxP)
и преобразует его, используя предоставленное замыкание, в кортеж исходного значения и результат вызова primecheck
с этим значением.Результатом является требуемый массив с сопряжением значений с bools, указывающими, являются ли они простыми.
Ваша функция primecheck
может быть очищена с помощью guard
для немедленного return false
для чиселне более 1
.Вы можете сразу же return false
, если найдете число, которое равномерно делит ввод, в противном случае return true
, если ничего не найдено.
func primecheck (numbers:Int) -> Bool {
guard numbers > 1 else { return false }
for i in 2..<numbers {
if numbers % i == 0 {
return false
}
}
return true
}
Примечания:
- Вы можете дополнительно оптимизировать
primecheck
, отказавшись от проверки на делитель, когда i * i > numbers
.Добавьте guard i * i <= numbers else { return true }
вверху цикла for
.В качестве альтернативы, установите верхний предел диапазона делителей на Int(sqrt(Double(numbers)))
. 2...numbers - 1
был переписан как 2..<numbers
. - Имена функций должны начинаться со строчной буквы.