Напиши функцию для подсчёта суммы элементов массива на Swift
Что проверяют
Знаете ли вы стандартную библиотеку Swift или пишете на нём как на C. Вопрос разминочный, но по нему видно, дойдёте ли вы сами до reduce, до обобщённой сигнатуры и до разговора про переполнение.
Как отвечать
Начните с одной строки, она и есть ожидаемый ответ:
func sum(_ numbers: [Int]) -> Int {
numbers.reduce(0, +)
}Пустой массив тут не особый случай: reduce вернёт начальное значение, то есть ноль, отдельная проверка не нужна. Дальше покажите, что понимаете обобщение: расширение по протоколу работает и для целых, и для дробных.
extension Sequence where Element: Numeric {
func total() -> Element {
reduce(.zero, +)
}
}Проговорите сложность: один проход, линейное время и константная память, ленивые обёртки тут ничего не ускорят. И отдельно про переполнение: сложение Int в Swift на переполнении роняет приложение, а не заворачивает значение молча. Если данные могут выйти за границы типа, честный ответ это оператор &+ с оговоркой про циклическую арифметику либо переход на более широкий тип.
Где спотыкаются
Пишут цикл с накоплением в переменной и останавливаются на нём. Ответ верный, но на вопрос, как то же самое записать короче, кандидат разводит руками, и это читается как незнакомство с базовой библиотекой.
Второе: добавляют guard !numbers.isEmpty else { return 0 }, считая пустой массив краем. Лишняя строка, которая показывает, что поведение reduce человек не знает и проверяет его на всякий случай.
Третье: путают reduce и reduce(into:). Для чисел разницы нет, а при сборке массива или словаря reduce(into:) избавляет от копирования аккумулятора на каждом шаге. Спрашивают про это обычно сразу следом.