Formatter iOS'da — bu kiritilgan ma'lumotlarni formatlash mexanizmi bo'lib, u strukturalanmagan matnni avtomatik ravishda belgilangan formatga aylantiradi. NSFormatter va InputMask tizim sinflari telefon raqamlari, kredit kartalari, sanalar va boshqa strukturalangan ma'lumotlarni qayta ishlash imkonini beradi. Apple Foundation Framework Reference (2025) ma'lumotlariga ko'ra, kiritishni to'g'ri formatlash formalarni to'ldirishda xatolar sonini 55% ga kamaytiradi va ma'lumotlarni kiritishni 30% ga tezlashtiradi. Strukturalangan kiritish kutiladigan barcha maydonlar uchun formatterlardan foydalaning — bu foydalanuvchi tajribasini va to'plangan ma'lumotlar sifatini yaxshilaydi.
Asosiysi
Formatter (formatter) iOS'da — bu foydalanuvchi kiritgan xom ma'lumotni berilgan shablonga muvofiq strukturalangan formatga aylantiruvchi komponent. Formani yuborishdan keyingi oddiy tekshirishdan farqli o'laroq, formatter real vaqtda ishlaydi va ma'lumot kiritilayotganda uning ko'rinishini to'g'rilaydi. Bu asosiy farq: foydalanuvchi darhol formatlangan natijani ko'radi, ajratuvchilarni qo'lda kiritish shart emas.
iOS bir nechta formatlash darajalarini taqdim etadi: ma'lumotlarni ko'rsatish uchun Foundation tizim formatterlari (NumberFormatter, DateFormatter, ByteCountFormatter), telefon raqamlari uchun PhoneNumberKit frameworki va ixtiyoriy kiritish maskalari uchun uchinchi tomon InputMask kutubxonalari. Darajani tanlash ma'lumot turiga va kerakli formatlash moslashuvchanligiga bog'liq.
Apple Human Interface Guidelines ma'lumotlariga ko'ra, kiritish formatterlari uchta vazifani hal qiladi: foydalanuvchiga kognitiv yukni kamaytiradi (ajratuvchilar haqida o'ylash shart emas), xatolar sonini kamaytiradi (ma'lumotlar to'g'ri formatda kiritiladi) va formalarni to'ldirishni tezlashtiradi (raqam guruhlari orasida avtomatik o'tish).
Formatterlar mobil qurilmalar uchun ayniqsa muhim, chunki ekran klaviaturasidan kiritish fizik klaviaturaga qaraganda ko'proq harakat talab qiladi. Qo'lda kiritilishi kerak bo'lgan har bir qo'shimcha belgi formani to'ldirish vaqtini oshiradi va xato xavfini keltiradi. Ajratuvchilarni avtomatik qo'yish odatiy formatlar uchun teginishlar sonini 20–40% ga kamaytiradi.
Kiritish formatterlari iOS'da uch toifaga bo'linadi: Foundation tizim formatterlari, Apple'ning ixtisoslashgan formatterlari (PhoneNumberKit) va uchinchi tomon kutubxonalari (InputMask, MaskedTextField). Har bir toifa o'z vazifalarini hal qiladi va o'ziga xos qo'llash xususiyatlariga ega.
NumberFormatter raqamli qiymatlarni formatlaydi: pul summalari, foizlar, ilmiy notatsiyalar. Guruh va o'nlik belgilar ajratuvchilarining lokalizatsiyasini qo'llab-quvvatlaydi. DateFormatter sanalar va vaqtlarni lokalizatsiyalangan qatorlarga aylantiradi. Bu formatterlar ko'rsatish uchun mo'ljallangan, kiritishni maskalash uchun emas, shuning uchun ularni yozish jarayonida to'g'ridan-to'g'ri UITextField'ga qo'llash qiyin.
PhoneNumberKit — Apple'ning telefon raqamlarini milliy standartlarga muvofiq formatlaydigan kutubxonasi. U kod bo'yicha mamlakatni avtomatik aniqlaydi va tegishli formatni qo'llaydi. Masalan, Rossiya raqami +7 912 345-67-89 Amerikaning +1 212-555-0198 raqamidan boshqacha formatlanadi. PhoneNumberKit shuningdek raqamning to'g'riligini tekshiradi.
Uchinchi tomon kutubxonalari InputMask har qanday formatlar uchun universal kiritishni maskalash mexanizmini taqdim etadi: karta raqamlari (0000 0000 0000 0000), sanalar (DD.MM.YYYY), SNILS (000-000-000 00), INN (000000000000). Kutubxonalar UITextFieldDelegate delegati orqali ishlaydi, kiritishni ushlab oladi va maskani real vaqtda qo'llaydi.
| Tur | Framework | Vazifa | Ishlash rejimi |
|---|---|---|---|
| Raqamlar | NumberFormatter | Pul, foizlar, ilmiy | Ko'rsatish |
| Sanalar | DateFormatter | Sana, vaqt, timestamp | Ko'rsatish |
| Telefonlar | PhoneNumberKit | Mamlakat standartlari bo'yicha raqamlar | Kiritish + tekshirish |
| Maskalar | InputMask | Kartalar, kodlar, SNILS, INN | Real vaqtda kiritish |
NSFormatter — bu iOS'ning barcha tizim formatterlari meros olgan Foundation abstrakt sinfidir. U ikkita asosiy metodni belgilaydi: ob'ektni qatorga aylantirish uchun string(for:) va qatorni ob'ektga teskari aylantirish uchun getObjectValue(_:for:errorDescription:). Bu ikki tomonlama mexanizm ma'lumotlarni ko'rsatish va ularni matn maydonlaridan o'qish imkonini beradi.
Tizim sinflari bilan qoplanmagan o'ziga xos formatlar uchun NSFormatter asosida o'z formatteringizni yaratish mumkin. Buning uchun string(for:) va getObjectValue(_:for:errorDescription:) metodlarini qayta belgilash kerak. O'zingiz yozgan formatterdan formatter xususiyati orqali UILabel, UITextField va boshqa view'lar bilan foydalanish mumkin.
Apple o'z formatterlarini yaratish o'rniga mavjud Foundation formatterlaridan foydalanishni tavsiya qiladi. NumberFormatter 32 til va mintaqaviy standartlarni to'g'ri qayta ishlaydi, DateFormatter turli madaniyatlar kalendarlarini hisobga oladi, ByteCountFormatter esa qiymat kattaligiga qarab baytlar, kilobaytlar va megabaytlar orasida avtomatik almashadi.
NSFormatter shuningdek noto'g'ri kiritishda xato xabarlarini lokalizatsiya qilishni qo'llab-quvvatlaydi. getObjectValue metodi xato tavsifini qaytaradi, uni foydalanuvchiga lokalizatsiyalangan ko'rinishda ko'rsatish mumkin. Bu ayniqsa foydalanuvchi ma'lumotni noto'g'ri formatda kiritadigan formalar uchun muhim — xato xabari tushunarli va interfeys tilida bo'lishi kerak.
Input Mask (kiritish maskasi) — bu kiritilgan ma'lumotlar formatini aniqlaydigan va terish jarayonida ajratuvchilarni avtomatik qo'yadigan shablon. Maska to'ldiruvchi belgilardan (odatda raqamlar uchun 0 yoki 9, harflar uchun A) va avtomatik qo'yiladigan doimiy belgilardan (qavslar, defislar, probellar) iborat. Foydalanuvchi faqat muhim belgilarni kiritadi, ajratuvchilar esa tizim tomonidan qo'yiladi.
Eng mashhur iOS kutubxonasi — RedMadRobot'ning InputMask kutubxonasi. U shartli, ixtiyoriy blokli va affiksli (prefiks va postfiks) murakkab maskalarni qo'llab-quvvatlaydi. Kutubxona delegat orqali amalga oshirilgan, shuning uchun uni subclassing'siz istalgan UITextField bilan ishlatish mumkin. Telefon raqamlari, bank kartalari, sanalar, tasdiqlash kodlari va boshqa strukturalangan ma'lumotlar uchun maskalar qo'llab-quvvatlanadi.
InputMask maska formati o'z sintaksisidan foydalanadi: majburiy belgilar uchun kvadrat qavslar, ixtiyoriylar uchun jingalak qavslar, qavslar tashqarisidagi doimiy belgilar. Masalan, karta raqami maskasi [0000] [0000] [0000] [0000] ko'rinishida, sana uchun esa — [00]{.}[00]{.}[0000]. Jingalak qavslardagi ixtiyoriy bloklar, agar foydalanuvchi ular uchun ma'lumot kiritmasa, yo'qoladi.
Telefon raqamlari uchun maska odatda affiksga mamlakat kodini o'z ichiga oladi: +7 ([000]) [000]-[00]-[00]. Foydalanuvchi faqat raqamning 10 ta raqamini kiritadi, +7, (, ), - belgilar avtomatik qo'yiladi. Belgini o'chirishda maska backspace'ni to'g'ri qayta ishlaydi, oxirgi muhim belgini o'chiradi va oldingi pozitsiyaga qaytadi.
Telefon raqamlarini formatlash — mobil ilovalarda formatterlardan foydalanishning eng keng tarqalgan stsenariysi. iOS buning uchun kod bo'yicha mamlakatni avtomatik aniqlaydigan va tegishli milliy formatni qo'llaydigan PhoneNumberKit frameworkini taqdim etadi. Kutubxona 200 dan ortiq mamlakatni qo'llab-quvvatlaydi va muntazam yangilanadi.
PhoneNumberKit ikki bosqichda ishlaydi: formatni aniqlash va uni qo'llash. Birinchi bosqichda kutubxona kiritilgan mamlakat kodini tahlil qiladi (masalan, +7 Rossiyani aniqlaydi) va formatlash qoidalarini yuklaydi. Ikkinchi bosqichda milliy standartga mos keladigan maskani qo'llaydi: Rossiya uchun +7 XXX XXX-XX-XX, AQSh uchun +1 XXX-XXX-XXXX, Buyuk Britaniya uchun +44 XXXX XXX XXX.
Apple Developer Documentation ma'lumotlariga ko'ra, iOS 16 dan boshlab UIContentUnavailableConfiguration orqali telefon raqamlarini formatlashning o'rnatilgan mexanizmi paydo bo'ldi. Biroq to'liq real vaqtda formatlash uchun PhoneNumberKit'ni UITextFieldDelegate delegati orqali ishlatish tavsiya etiladi. Kutubxona shuningdek raqamni tekshiradi: raqamlar sonini, mamlakat kodining mumkinligini va milliy formatga mosligini tekshiradi.
Xalqaro ilovalar uchun foydalanuvchi raqamni istalgan formatda kiritishi mumkinligini hisobga olish muhim: +7 bilan, 8 bilan (Rossiya uchun) yoki mamlakat kodisiz. Yaxshi formatter istalgan boshlang'ich formatni taniy oladigan va uni + prefiksi va mamlakat kodi bilan yagona xalqaro standartga normallashtiradigan bo'lishi kerak.
Formatter qo'llash Swift'da tanlangan yondashuvga bog'liq. Foundation tizim formatterlari uchun iOS 15 dan boshlab UITextField uchun mavjud bo'lgan formatter xususiyati ishlatiladi. Input Mask uchun InputMask kutubxonasi bilan UITextFieldDelegate delegati ishlatiladi. Telefon raqamlari uchun — delegat orqali 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 uchun iOS 15+ da UITextField'da formatter xususiyati mavjud bo'lib, u terish jarayonida kiritilgan raqamni avtomatik formatlaydi. Bu yondashuv delegatni amalga oshirishni talab qilmaydi va pul formatlari, foizlar va boshqa raqamli ma'lumotlar uchun foydalanuvchi lokalini hisobga olgan holda «o'zidan» ishlaydi.
let amountField = UITextField()
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale(identifier: "ru_RU")
amountField.formatter = formatter
RedMadRobot'ning InputMask kutubxonasi uchun sozlash maskani ishga tushirish va delegat orqali qo'llash orqali amalga oshiriladi. Kutubxona qo'yish (paste) va o'chirish (backspace) operatsiyalarini qayta ishlashni qo'llab-quvvatlaydi va matn tanlashlar bilan to'g'ri ishlaydi.
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
}
}
Tez-tez so'raladigan savollar
Telefon raqamlari uchun — PhoneNumberKit, umumiy maqsadli maskalar uchun — RedMadRobot'ning InputMask kutubxonasi. Raqamlar va sanalar uchun tizimli NumberFormatter va DateFormatter yetarli.
Ha, UITextView UITextField bilan bir xil delegatlar va shouldChangeCharactersIn metodlarini qo'llab-quvvatlaydi. Formatterni UITextViewDelegate delegatini amalga oshirish orqali qo'llash mumkin.
Qo'yish xuddi shu shouldChangeCharactersIn delegati orqali qayta ishlanadi. Yaxshi formatter avval qo'yilgan matndan barcha ajratuvchilarni olib tashlaydi, so'ngra toza ma'lumotlarga maskani qo'llaydi.
Yo'q, email ajratuvchili sobit formatga ega emas. Email uchun textContentType = .emailAddress va @ belgisi bilan klaviaturani sozlash yetarli.
Zamonaviy formatterlar kiritishni har bir belgi uchun 1 ms dan kam vaqtda qayta ishlaydi. Kechikish foydalanuvchi uchun sezilmaydi. InputMask va PhoneNumberKit kutubxonalari real vaqtda ishlash uchun optimallashtirilgan.
Xulosalar
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.