Formatter в iOS — это механизм форматирования вводимых данных, который автоматически преобразует неструктурированный текст в заданный формат. Системные классы NSFormatter и InputMask позволяют обрабатывать номера телефонов, кредитных карт, даты и другие структурированные данные. По данным Apple Foundation Framework Reference (2025), правильное форматирование ввода снижает количество ошибок при заполнении форм на 55% и ускоряет ввод данных на 30%. Используйте форматтеры для всех полей, где ожидается структурированный ввод — это улучшает пользовательский опыт и качество собираемых данных.
Главное
Formatter (форматтер) в iOS — это компонент, который преобразует необработанный пользовательский ввод в структурированный формат согласно заданному шаблону. В отличие от простой валидации после отправки формы, форматтер работает в реальном времени, корректируя отображение данных по мере их ввода. Это ключевое отличие: пользователь видит отформатированный результат сразу, без необходимости вводить разделители вручную.
iOS предоставляет несколько уровней форматирования: системные форматтеры Foundation (NumberFormatter, DateFormatter, ByteCountFormatter) для отображения данных, фреймворк PhoneNumberKit для телефонных номеров и сторонние библиотеки InputMask для произвольных масок ввода. Выбор уровня зависит от типа данных и требуемой гибкости форматирования.
По данным Apple Human Interface Guidelines, форматтеры ввода решают три задачи: снижают когнитивную нагрузку на пользователя (не нужно думать о разделителях), уменьшают количество ошибок (данные вводятся в корректном формате) и ускоряют заполнение форм (автоматический переход между группами цифр).
Форматтеры особенно важны для мобильных устройств, где ввод с экранной клавиатуры требует больше усилий, чем с физической. Каждый лишний символ, который нужно ввести вручную, увеличивает время заполнения формы и риск ошибки. Автоматическая подстановка разделителей сокращает число касаний на 20–40% для типовых форматов.
Форматтеры ввода в iOS делятся на три категории: системные форматтеры Foundation, специализированные форматтеры Apple (PhoneNumberKit) и сторонние библиотеки (InputMask, MaskedTextField). Каждая категория решает свои задачи и имеет особенности реализации.
NumberFormatter форматирует числовые значения: денежные суммы, проценты, научные нотации. Поддерживает локализацию разделителей групп и десятичных знаков. DateFormatter преобразует даты и время в локализованные строки. Эти форматтеры предназначены для отображения, а не для маскирования ввода, поэтому их сложно применить напрямую к UITextField в процессе набора.
PhoneNumberKit — библиотека Apple для форматирования телефонных номеров в соответствии с национальными стандартами. Она автоматически определяет страну по коду и применяет соответствующий формат. Например, российский номер +7 912 345-67-89 форматируется иначе, чем американский +1 212-555-0198. PhoneNumberKit также валидирует номер на корректность.
Сторонние библиотеки InputMask предоставляют универсальный механизм маскирования ввода для любых форматов: номера карт (0000 0000 0000 0000), даты (ДД.ММ.ГГГГ), СНИЛС (000-000-000 00), ИНН (000000000000). Библиотеки работают через делегат UITextFieldDelegate, перехватывая ввод и применяя маску в реальном времени.
| Тип | Фреймворк | Назначение | Режим работы |
|---|---|---|---|
| Числа | NumberFormatter | Деньги, проценты, научные | Отображение |
| Даты | DateFormatter | Дата, время, таймстамп | Отображение |
| Телефоны | PhoneNumberKit | Номера по стандартам стран | Ввод + валидация |
| Маски | InputMask | Карты, коды, СНИЛС, ИНН | Ввод в реальном времени |
NSFormatter — это абстрактный класс Foundation, от которого наследуются все системные форматтеры iOS. Он определяет два основных метода: string(for:) для преобразования объекта в строку и getObjectValue(_:for:errorDescription:) для обратного преобразования строки в объект. Этот двухсторонний механизм позволяет как отображать данные, так и считывать их из текстовых полей.
Создание собственного форматтера на основе NSFormatter возможно для специфических форматов, не покрытых системными классами. Для этого необходимо переопределить методы string(for:) и getObjectValue(_:for:errorDescription:). Самописный форматтер можно использовать с UILabel, UITextField и другими view через свойство formatter.
Apple рекомендует использовать существующие форматтеры Foundation вместо создания собственных. NumberFormatter корректно обрабатывает 32 языка и региональные стандарты, DateFormatter учитывает календари разных культур, а ByteCountFormatter автоматически переключается между байтами, килобайтами и мегабайтами в зависимости от величины значения.
NSFormatter также поддерживает локализацию сообщений об ошибках при некорректном вводе. Метод getObjectValue возвращает описание ошибки, которое можно отобразить пользователю в локализованном виде. Это особенно важно для форм, где пользователь вводит данные в неверном формате — сообщение об ошибке должно быть понятным и на языке интерфейса.
Input Mask (маска ввода) — это шаблон, который определяет формат вводимых данных и автоматически подставляет разделители по мере набора. Маска состоит из символов-заполнителей (обычно 0 или 9 для цифр, A для букв) и константных символов (скобки, дефисы, пробелы), которые вставляются автоматически. Пользователь вводит только значимые символы, а разделители подставляются системой.
Наиболее популярная библиотека для iOS — InputMask от RedMadRobot. Она поддерживает сложные маски с условиями, необязательными блоками и аффиксом (префикс и постфикс). Библиотека реализована через делегат, что позволяет использовать её с любым UITextField без subclassing. Поддерживаются маски для телефонных номеров, банковских карт, дат, кодов подтверждения и других структурированных данных.
Формат маски InputMask использует собственный синтаксис: квадратные скобки для обязательных символов, фигурные для необязательных, константные символы вне скобок. Например, маска для номера карты выглядит как [0000] [0000] [0000] [0000], а для даты — [00]{.}[00]{.}[0000]. Необязательные блоки в фигурных скобках исчезают, если пользователь не вводит данные для них.
Для номеров телефонов маска обычно включает код страны в аффиксе: +7 ([000]) [000]-[00]-[00]. Пользователь вводит только 10 цифр номера, а символы +7, (, ), - подставляются автоматически. При удалении символа маска корректно обрабатывает backspace, удаляя последний значимый символ и возвращаясь к предыдущей позиции.
Форматирование телефонных номеров — наиболее частый сценарий использования форматтеров в мобильных приложениях. iOS предоставляет для этого фреймворк PhoneNumberKit, который автоматически определяет страну по коду и применяет соответствующий национальный формат. Библиотека поддерживает более 200 стран и регулярно обновляется.
PhoneNumberKit работает в два этапа: определение формата и его применение. На первом этапе библиотека анализирует введённый код страны (например, +7 определяет Россию) и загружает правила форматирования. На втором этапе она применяет маску, соответствующую национальному стандарту: для России это +7 XXX XXX-XX-XX, для США — +1 XXX-XXX-XXXX, для Великобритании — +44 XXXX XXX XXX.
По данным Apple Developer Documentation, с iOS 16 появился встроенный механизм форматирования телефонных номеров через UIContentUnavailableConfiguration. Однако для полноценного форматирования в реальном времени рекомендуется использовать PhoneNumberKit через делегат UITextFieldDelegate. Библиотека также валидирует номер: проверяет количество цифр, допустимость кода страны и соответствие национальному формату.
Для международных приложений важно учитывать, что пользователь может вводить номер в любом формате: с +7, 8 (для России) или без кода страны. Хороший форматтер должен распознавать любой начальный формат и нормализовать его к единому международному стандарту с префиксом + и кодом страны.
Реализация форматтера в Swift зависит от выбранного подхода. Для системных форматтеров Foundation используется свойство formatter, доступное с iOS 15 для UITextField. Для Input Mask используется делегат UITextFieldDelegate с библиотекой InputMask. Для телефонных номеров — PhoneNumberKit через делегат.
import PhoneNumberKit
class PhoneViewController: UIViewController {
let phoneNumberKit = PhoneNumberKit()
@IBOutlet var phoneField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
phoneField.delegate = self
}
}
extension PhoneViewController: UITextFieldDelegate {
func textField(
_ textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String
) -> Bool {
guard let text = textField.text else { return true }
let partial = (text as NSString).replacingCharacters(in: range, with: string)
textField.text = partial.applyPhoneMask()
return false
}
}
Для NumberFormatter с iOS 15+ доступно свойство formatter на UITextField, которое автоматически форматирует вводимое число по мере набора. Этот подход не требует реализации делегата и работает «из коробки» для денежных форматов, процентов и других числовых данных с учётом локали пользователя.
let amountField = UITextField()
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale(identifier: "ru_RU")
amountField.formatter = formatter
Для InputMask библиотеки RedMadRobot настройка выполняется через инициализацию маски и применение через делегат. Библиотека поддерживает обработку вставки (paste), удаления (backspace) и корректно работает с текстовыми выделениями.
import InputMask
class CardViewController: UIViewController {
@IBOutlet var cardField: UITextField!
var listener: MaskedTextFieldDelegate!
override func viewDidLoad() {
super.viewDidLoad()
listener = MaskedTextFieldDelegate(
primaryMaskFormat: "[0000] [0000] [0000] [0000]"
)
cardField.delegate = listener
}
}
Часто задаваемые вопросы
Для номеров телефонов — PhoneNumberKit, для масок общего назначения — InputMask от RedMadRobot. Для чисел и дат достаточно системных NumberFormatter и DateFormatter.
Да, UITextView поддерживает те же делегаты и методы shouldChangeCharactersIn, что и UITextField. Форматтер можно применить через реализацию делегата UITextViewDelegate.
Вставка обрабатывается через тот же делегат shouldChangeCharactersIn. Хороший форматтер сначала удаляет все разделители из вставленного текста, затем применяет маску к чистым данным.
Нет, email не имеет фиксированного формата с разделителями. Для email достаточно настроить textContentType = .emailAddress и клавиатуру с символом @.
Современные форматтеры обрабатывают ввод за менее 1 мс на символ. Задержка незаметна для пользователя. Библиотеки InputMask и PhoneNumberKit оптимизированы для работы в реальном времени.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также