Extension Swift-da mavjud turlarga ularning manba kodini o'zgartirmasdan yangi funksionallik qo'shish imkonini beruvchi mexanizmdir. Kengaytmalar metodlar, hisoblanuvchi xususiyatlar, inizializatorlar, subskriptlar, ichma-ich turlar va protokollarni amalga oshirishni qo'llab-quvvatlaydi. Apple Documentation, 2026 ma'lumotlariga ko'ra, kengaytmalar Swift loyihalarida kodni tashkil etish va Open/Closed prinsipiga rioya qilishning asosiy vositasidir.
Asosiy ma'lumotlar
Extension Swift-da mavjud turni (sinf, struktura, enum, protokol) yangi imkoniyatlar bilan kengaytirish imkonini beruvchi til konstruksiyasidir. Bu Objective-C-dagi kategoriyalarning o'xshashidir, lekin ko'proq imkoniyatlarga ega.
Extension qo'shishi mumkin:
Apple hujjatlariga ko'ra, extension mavjud metodlarni (dynamic dispatch) bekor qila olmaydi va stored properties qo'sha olmaydi. Bu cheklovlar asl turning yaxlitligini saqlaydi.
Extension extension kalit so'zi bilan kengaytiriladigan turni ko'rsatib e'lon qilinadi.
extension Double {
var km: Double { return self * 1000.0 }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1000.0 }
}
let distance = 5.0.km
print("5 km = \(distance) metr") // 5000.0
Faqat o'z turlaringizni emas, balki Swift, Foundation, UIKit va boshqa framework-larning standart kutubxona turlarini ham kengaytirishingiz mumkin. Bu extension-ni domenga xos funksionallik qo'shish uchun kuchli vositaga aylantiradi.
Extension har qanday mavjud turga namuna va tur metodlarini qo'shish imkonini beradi.
extension String {
func isValidEmail() -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
return self.range(of: emailRegex, options: .regularExpression) != nil
}
static func random(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyz0123456789"
return String((0..<length).map { _ in letters.randomElement()! })
}
}
let email = "user@example.com"
print(email.isValidEmail()) // true
let code = String.random(length: 8) // "a3f8k2m1"
Mutatsiya qiluvchi metodlar qiymat turlarini (struct, enum) kengaytiradi va self-ni o'zgartirishi mumkin. Sinflar uchun mutatsiya talab qilinmaydi. Extension hatto standart kutubxona turlariga ham mutatsiya qiluvchi metodlar qo'shishi mumkin.
Extension faqat hisoblanuvchi xususiyatlar qo'shishi mumkin — stored properties taqiqlangan. Bu mantiqiy: extension asl turning xotirasini boshqarmaydi.
extension Date {
var isPast: Bool {
return self < Date()
}
var isToday: Bool {
return Calendar.current.isDateInToday(self)
}
}
let someDate = Date().addingTimeInterval(3600)
print(someDate.isPast) // false (bir soatdan keyin kelajak)
Extension-da computed properties asosiy amalga oshirishdagi kabi qoidalarga bo'ysunadi: { get } va { get set } xususiyatlari yaratilishi mumkin. Swift bir tur uchun extension soniga cheklov qo'ymaydi. Bir tur uchun turli fayllarda istalgancha extension e'lon qilishingiz mumkin — bu katta loyihalarda standart amaliyotdir.
Extension protokollarni amalga oshirishning afzal qilingan usulidir. Turning asosiy e'lonini chalkashtirish o'rniga, protokolning barcha metodlari alohida extension-ga joylashtiriladi.
struct User {
let id: Int
let name: String
let email: String
}
// Protokol bo'yicha Extension — toza ajratish
extension User: Equatable {
static func == (lhs: User, rhs: User) -> Bool {
return lhs.id == rhs.id
}
}
extension User: Codable {
enum CodingKeys: String, CodingKey {
case id, name, email
}
}
Bu yondashuv mas'uliyatni ajratadi: asosiy struktura faqat stored properties-ni o'z ichiga oladi, extensions — protokollarni amalga oshirishni. Swift hatto biz nazorat qilmaydigan turlar uchun extension orqali protokolni amalga oshirishga ruxsat beradi.
Extension nafaqat til imkoniyati, balki arxitekturaviy tashkil etish vositasidir. Extensions-dan to'g'ri foydalanish kodni o'qiladigan va oson boshqariladigan qiladi.
// MARK: - Equatable navigatsiya uchunprivate bilan belgilanadi// MARK: - User + Displayable
extension User: Displayable {
var displayName: String {
return "\(name) (\(email))"
}
}
Swift API Design Guidelines ga ko'ra, extensions o'qiluvchanlikni yaxshilaydi: dasturchi ma'lumotlar tuzilmasini asosiy e'londa, mantiqni esa extensions-da ko'radi. Bu interfeysni ajratish prinsipiga (Interface Segregation) mos keladi.
Where-cheklovli extension metodlarni faqat ma'lum turlar uchun qo'shadi: extension Array where Element: Equatable { func isUnique() -> Bool }. Bunday kod ixcham va tip-xavfsizdir — isUnique metodi faqat Equatable elementlari bo'lgan massivlarda paydo bo'ladi, kompilatsiya bosqichida xatolarni bartaraf qiladi va API-ni boshqa dasturchilar uchun toza, xavfsiz va tushunarli qiladi.
Tez-tez so'raladigan savollar
Yo'q, extension stored properties qo'sha olmaydi. Bu cheklov asosiy hisoblanadi: extension tur namunasiga xotira ajratishda ishtirok etmaydi. Stored properties uchun turning asosiy e'lonidan foydalaning.
Yo'q, extension metodlarni bekor qila olmaydi. Mavjud metod bilan bir xil imzoga ega metodni e'lon qilish urinishi kompilatsiya xatosiga olib keladi. Bekor qilish uchun sinf merosidan foydalaning.
Extension yangi tur yaratmasdan funksionallik qo'shadi. Subclassing iyerarxiya yaratadi va bekor qilishni qo'llab-quvvatlaydi. Extension manba kodiga kirishni talab qilmaydi va barcha turlar bilan ishlaydi.
Ha, agar kengaytirilayotgan tur generic bo'lsa, extension generic bo'lishi mumkin: extension Array where Element: Numeric. Shuningdek, extension ichida o'z tur parametrlari bilan generic metodlarni qo'shish mumkin.
Extension ishlashga ta'sir qilmaydi — extension metodlari oddiy metodlar kabi kompilatsiya qilinadi. Extension bilan protokollar uchun static dispatch ishlatiladi, bu sinflarning dynamic dispatch-dan tezroq bo'lishi mumkin.
Xulosa
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.