Как найти сумму элементов массива в Swift? Поиск суммы чисел
Правильный способ суммирования элементов массива в Swift
Привет! Твоя ошибка — классическая для начинающих. В цикле for i in numbers переменная i — это не индекс, а сами элементы массива. То есть на первой итерации i = 1, на второй — i = 2 и так далее. А ты пытаешься использовать numbers[i], что приводит к ошибке: Swift ожидает индекс, а ты даёшь значение.
Вот исправленный код с ручным циклом:
let numbers = [1, 2, 3, 4, 5]
var sum = 0
for number in numbers {
sum += number // то же самое, что sum = sum + number
}
print(sum) // 15
Если хочешь использовать индексы (например, когда нужен доступ к соседним элементам), пиши так:
var sum = 0
for i in 0..<numbers.count {
sum += numbers[i]
}
Лучший способ: встроенный метод reduce
В Swift есть элегантный функциональный метод reduce(_:_:). Он "сворачивает" массив в одно значение:
let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0, +)
print(sum) // 15
0— начальное значение (с чего начинаем суммирование).+— оператор, который применяется к каждому элементу. Можно заменить на замыкание:numbers.reduce(0) { $0 + $1 }.
Работа с опциональными массивами
Если массив сам опциональный ([Int]?), используй optional chaining и nil-coalescing:
let optionalNumbers: [Int]? = [1, 2, 3]
let sum = optionalNumbers?.reduce(0, +) ?? 0
print(sum) // 6 (если массив nil, то sum = 0)
Массив с опциональными элементами ([Int?])
Если внутри массива могут быть nil, используй compactMap для фильтрации nil:
let numbersWithNil: [Int?] = [1, nil, 3, nil, 5]
let sum = numbersWithNil.compactMap { $0 }.reduce(0, +)
print(sum) // 9 (nil-значения проигнорированы)
compactMap { $0 }— удаляет всеnilи возвращает[Int].- Затем
reduceсуммирует только реальные числа.
Производительность
Для больших массивов reduce работает так же быстро, как и цикл for, но код становится короче и читаемее. Если массив пустой, reduce вернёт начальное значение (в нашем случае 0).
Надеюсь, теперь стало понятно! Используй reduce как основной способ, а циклы — когда нужен более сложный контроль.
Альтернативный подход: метод reduce(into:_:) и суммирование с условием
Если нужно суммировать не все элементы, а только те, что соответствуют условию, используй reduce(into:_:) или комбинацию filter + reduce.
Пример: сумма только чётных чисел
let numbers = [1, 2, 3, 4, 5, 6]
let sumEven = numbers.reduce(0) { $0 + ($1.isMultiple(of: 2) ? $1 : 0) }
print(sumEven) // 12 (2+4+6)
Или более читаемый вариант:
let sumEven = numbers.filter { $0.isMultiple(of: 2) }.reduce(0, +)
Сумма с помощью reduce(into:_:)
Этот метод полезен, когда результат — не просто число, а сложная структура. Например, сумма и количество элементов:
let result = numbers.reduce(into: (sum: 0, count: 0)) { partialResult, number in
partialResult.sum += number
partialResult.count += 1
}
print("Сумма: \(result.sum), количество: \(result.count)")
Для массивов Float или Double — всё то же самое, только начальное значение 0.0:
let doubles = [1.5, 2.5, 3.0]
let sum = doubles.reduce(0.0, +) // 7.0
Этот подход удобен, когда нужно избежать множественных проходов по массиву (как в случае filter + reduce). Для простого суммирования используй первый ответ — метод reduce(0, +).
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги