Как реализовать функцию умножения числа на десять с обработкой символов
Что проверяют
Задача простая, поэтому смотрят на то, как вы обращаетесь с невалидным вводом и знаете ли подводные камни Swift: опционалы, переполнение Int, устройство Character. Следом обычно спрашивают, что вернёт ваша функция для "1a2", "-5" и строки из тридцати цифр.
Как отвечать
Первым делом уточните требования, у фразы «с обработкой символов» минимум два смысла:
- строгий разбор: строка должна быть числом целиком, иначе ошибка. Это
Int(input.trimmingCharacters(in: .whitespaces)), который вернётnilна"12a"и сам поддержит знак; - выборка цифр: из
"a1b2"получаем12. Тогда фильтр, но аккуратный.
Сигнатура: либо Int?, либо throws с собственным enum ошибок (empty, invalidCharacter, overflow). Второе лучше, если вызывающему важна причина. В Swift 6 можно объявить типизированный throws(ParseError).
Умножение нужно защитить: number * 10 при переполнении не оборачивается, а роняет приложение в рантайме. Используйте number.multipliedReportingOverflow(by: 10) и проверяйте флаг overflow.
Про фильтр: Character.isNumber возвращает true для «½», «٣» и других символов Юникода, на которых Int(_:) потом вернёт nil. Надёжнее проверять $0.isASCII && $0.isNumber, а если цифры других письменностей тоже нужно принимать, брать $0.wholeNumberValue, который сразу отдаёт значение цифры.
Покажите тесты на XCTest или Swift Testing (@Test, #expect): пустая строка, пробелы, минус, ведущие нули, значение около Int.max.
Где спотыкаются
Фильтруют всё, кроме цифр, и молча теряют минус: "-5" превращается в 50. Если отрицательные числа допустимы, знак нужно обработать отдельно.
Не думают о переполнении. У Int на 64-битных платформах максимум около 9,2 × 10^18: длинная строка просто не распарсится, а * 10 на крайних значениях приводит к падению приложения, а не к ошибке, которую можно поймать.
Возвращают 0 вместо nil при неудаче. Тогда вызывающий код не отличает ввод "0" от мусора.