Formatter — що це, форматувачі введення та NSFormatter

Автор: IT Sectr Опубліковано: 2026-07-08 Час читання: 8 хв

Formatter в iOS — це механізм форматування введених даних, який автоматично перетворює неструктурований текст у заданий формат. Системні класи NSFormatter та InputMask дозволяють обробляти номери телефонів, кредитних карток, дати та інші структуровані дані. Згідно з Apple Foundation Framework Reference (2025), правильне форматування введення знижує кількість помилок при заповненні форм на 55% та прискорює введення даних на 30%. Використовуйте форматувачі для всіх полів, де очікується структуроване введення — це покращує користувацький досвід та якість зібраних даних.

Головне

  • Formatter — системний механізм iOS для автоматичного форматування введених даних відповідно до заданого шаблону
  • NSFormatter — абстрактний клас Foundation, на основі якого побудовані NumberFormatter, DateFormatter та інші
  • Input Mask — бібліотека маскування введення для форматування номерів телефонів, карток, дат та кодів
  • Phone Number Kit — фреймворк від Apple для форматування та валідації номерів телефонів
  • Маски введення визначають шаблон (наприклад, +7 (___) ___-__-__) та автоматично підставляють роздільники

Що таке Formatter в iOS?

Formatter в iOS — це компонент, який перетворює необроблений користувацький ввід у структурований формат згідно із заданим шаблоном. На відміну від простої валідації після відправлення форми, форматувач працює в реальному часі, коригуючи відображення даних у міру їх введення. Це ключова відмінність: користувач бачить відформатований результат негайно, без необхідності вводити роздільники вручну.

iOS надає кілька рівнів форматування: системні форматувачі Foundation (NumberFormatter, DateFormatter, ByteCountFormatter) для відображення даних, фреймворк PhoneNumberKit для номерів телефонів та сторонні бібліотеки InputMask для довільних масок введення. Вибір рівня залежить від типу даних та необхідної гнучкості форматування.

Згідно з Apple Human Interface Guidelines, форматувачі введення вирішують три завдання: знижують когнітивне навантаження на користувача (не потрібно думати про роздільники), зменшують кількість помилок (дані вводяться у правильному форматі) та прискорюють заповнення форм (автоматичний перехід між групами цифр).

Форматувачі особливо важливі для мобільних пристроїв, де введення з екранної клавіатури вимагає більше зусиль, ніж з фізичною. Кожен зайвий символ, який потрібно ввести вручну, збільшує час заповнення форми та ризик помилки. Автоматична підстановка роздільників скорочує кількість натискань на 20–40% для типових форматів.

Типи форматувачів введення

Форматувачі введення в iOS поділяються на три категорії: системні форматувачі Foundation, спеціалізовані форматувачі Apple (PhoneNumberKit) та сторонні бібліотеки (InputMask, MaskedTextField). Кожна категорія вирішує свої завдання та має особливості реалізації.

Системні форматувачі Foundation

NumberFormatter форматує числові значення: грошові суми, відсотки, наукові нотації. Підтримує локалізацію роздільників груп та десяткових знаків. DateFormatter перетворює дати та час у локалізовані рядки. Ці форматувачі призначені для відображення, а не для маскування введення, тому їх складно застосувати безпосередньо до UITextField під час набору.

PhoneNumberKit

PhoneNumberKit — це бібліотека Apple для форматування номерів телефонів відповідно до національних стандартів. Вона автоматично визначає країну за кодом та застосовує відповідний формат. Наприклад, російський номер +7 912 345-67-89 форматується інакше, ніж американський +1 212-555-0198. PhoneNumberKit також валідує номер на коректність.

Бібліотеки Input Mask

Сторонні бібліотеки InputMask надають універсальний механізм маскування введення для будь-яких форматів: номери карток (0000 0000 0000 0000), дати (ДД.ММ.РРРР), РНОКПП (000-000-000 00), ІПН (000000000000). Бібліотеки працюють через делегат UITextFieldDelegate, перехоплюючи введення та застосовуючи маску в реальному часі.

ТипФреймворкПризначенняРежим роботи
ЧислаNumberFormatterГроші, відсотки, науковіВідображення
ДатиDateFormatterДата, час, часова міткаВідображення
ТелефониPhoneNumberKitНомери за стандартами країнВведення + валідація
МаскиInputMaskКартки, коди, РНОКПП, ІПНВведення в реальному часі

Абстрактний клас NSFormatter

NSFormatter — це абстрактний клас Foundation, від якого успадковуються всі системні форматувачі iOS. Він визначає два основні методи: string(for:) для перетворення об’єкта в рядок та getObjectValue(_:for:errorDescription:) для зворотнього перетворення рядка в об’єкт. Цей двосторонній механізм дозволяє як відображати дані, так і зчитувати їх з текстових полів.

Створення власного форматувача на основі NSFormatter можливе для специфічних форматів, не охоплених системними класами. Для цього потрібно перевизначити методи string(for:) та getObjectValue(_:for:errorDescription:). Власний форматувач можна використовувати з UILabel, UITextField та іншими відженнями через властивість formatter.

Apple рекомендує використовувати існуючі форматувачі Foundation замість створення власних. NumberFormatter коректно обробляє 32 мови та регіональні стандарти, DateFormatter враховує календарі різних культур, а ByteCountFormatter автоматично перемикається між байтами, кілобайтами та мегабайтами залежно від величини значення.

NSFormatter також підтримує локалізацію повідомлень про помилки при некоректному введенні. Метод getObjectValue повертає опис помилки, який можна відобразити користувачеві у локалізованому вигляді. Це особливо важливо для форм, де користувач вводить дані у невірному форматі — повідомлення про помилку має бути зрозумілим і мовою інтерфейсу.

Input Mask та маскування введення

Input Mask (маска введення) — це шаблон, який визначає формат введених даних та автоматично підставляє роздільники під час набору. Маска складається з символів-заповнювачів (звичайно 0 або 9 для цифр, A для літер) та константних символів (дужки, дефіси, пробіли), які вставляються автоматично. Користувач вводить лише значущі символи, а роздільники підставляються системою.

Найпопулярніша бібліотека для iOS — InputMask від RedMadRobot. Вона підтримує складні маски з умовами, необов’язковими блоками та афіксом (префікс та постфікс). Бібліотека реалізована через делегат, що дозволяє використовувати її з будь-яким UITextField без створення підкласів. Підтримуються маски для номерів телефонів, банківських карток, дат, кодів підтвердження та інших структурованих даних.

Формат маски 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

Реалізація форматувача в Swift залежить від вибраного підходу. Для системних форматувачів Foundation використовується властивість formatter, доступна з iOS 15 для UITextField. Для Input Mask використовується делегат UITextFieldDelegate з бібліотекою InputMask. Для номерів телефонів — PhoneNumberKit через делегат.

swift
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, яка автоматично форматує число, що вводиться, під час набору. Цей підхід не вимагає реалізації делегата та працює «з коробки» для грошових форматів, відсотків та інших числових даних з урахуванням локалі користувача.

swift
let amountField = UITextField()
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale(identifier: "ru_RU")
amountField.formatter = formatter

Для бібліотеки InputMask від RedMadRobot налаштування виконується через ініціалізацію маски та застосування через делегат. Бібліотека підтримує обробку вставки (paste), видалення (backspace) та коректно працює з текстовими виділеннями.

swift
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
    }
}

Часто задавані питання

Яка бібліотека форматувача краще для iOS?

Для номерів телефонів — PhoneNumberKit, для масок загального призначення — InputMask від RedMadRobot. Для чисел та дат достатньо системних NumberFormatter та DateFormatter.

Чи працює форматувач з UITextView?

Так, UITextView підтримує ті ж делегати та методи shouldChangeCharactersIn, що й UITextField. Форматувач можна застосувати через реалізацію делегата UITextViewDelegate.

Як обробити вставку тексту з форматувачем?

Вставка обробляється через той же делегат shouldChangeCharactersIn. Хороший форматувач спочатку видаляє всі роздільники з вставленого тексту, потім застосовує маску до чистих даних.

Чи потрібен форматувач для поля email?

Ні, email не має фіксованого формату з роздільниками. Для email достатньо налаштувати textContentType = .emailAddress та клавіатуру з символом @.

Як форматувач впливає на продуктивність?

Сучасні форматувачі обробляють введення за менше ніж 1 мс на символ. Затримка непомітна для користувача. Бібліотеки InputMask та PhoneNumberKit оптимізовані для роботи в реальному часі.

Підсумки

  • Formatter — механізм iOS для автоматичного форматування структурованих даних в реальному часі
  • Системні форматувачі Foundation (NumberFormatter, DateFormatter) підходять для чисел та дат
  • PhoneNumberKit — рішення для форматування номерів телефонів за стандартами 200+ країн
  • Input Mask — універсальний інструмент для масок введення будь-яких структурованих даних
  • Маски введення скорочують кількість помилок при заповненні форм на 55% за даними Apple
  • UITextFieldDelegate — основний спосіб інтеграції форматувача з текстовими полями
  • Рекомендація — використовуйте форматувач для всіх полів зі структурованим форматом даних

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також