Swift-da Extension: nima, sintaksis va metodlarni qanday qo'shish

Muallif: IT Sectr Nashr etilgan: 2026-06-18 O'qish vaqti: 6 daq

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 — asl nusxani o'zgartirmasdan mavjud turlarga funksionallik qo'shish
  • Computed properties — extension orqali qo'shiladi, stored — yo'q
  • Protocol conformance — har qanday tur uchun extension orqali protokolni amalga oshirish
  • Kodni tashkil etish — extensions bog'liq mantiqni protokollar bo'yicha guruhlaydi
  • Open/Closed — extensions kengaytirish uchun ochiqlik prinsipini amalga oshiradi

Swift-da Extension nima?

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:

  • Hisoblanuvchi xususiyatlar namuna va tur uchun
  • Metodlar namuna va tur uchun
  • Initsializatorlar (convenience init)
  • Subskriptlar
  • Ichma-ich turlar
  • Protocol conformances

Apple hujjatlariga ko'ra, extension mavjud metodlarni (dynamic dispatch) bekor qila olmaydi va stored properties qo'sha olmaydi. Bu cheklovlar asl turning yaxlitligini saqlaydi.

Kengaytmalar sintaksisi

Extension extension kalit so'zi bilan kengaytiriladigan turni ko'rsatib e'lon qilinadi.

swift
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 orqali metodlarni qo'shish

Extension har qanday mavjud turga namuna va tur metodlarini qo'shish imkonini beradi.

swift
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-da Computed Properties

Extension faqat hisoblanuvchi xususiyatlar qo'shishi mumkin — stored properties taqiqlangan. Bu mantiqiy: extension asl turning xotirasini boshqarmaydi.

swift
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 orqali protokollarni amalga oshirish

Extension protokollarni amalga oshirishning afzal qilingan usulidir. Turning asosiy e'lonini chalkashtirish o'rniga, protokolning barcha metodlari alohida extension-ga joylashtiriladi.

swift
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 va kodni tashkil etish

Extension nafaqat til imkoniyati, balki arxitekturaviy tashkil etish vositasidir. Extensions-dan to'g'ri foydalanish kodni o'qiladigan va oson boshqariladigan qiladi.

  • Protokollar bo'yicha guruhlash — har bir protokol alohida extension-da
  • Markalar (MARK)// MARK: - Equatable navigatsiya uchun
  • Fayllarni ajratish — turli protokollar uchun extensions alohida fayllarda
  • Private helperlar — extension-dagi shaxsiy metodlar private bilan belgilanadi
swift
// 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

Extension stored properties qo'sha oladimi?

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.

Extension orqali mavjud metodni bekor qilish mumkinmi?

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 subclassing-dan nima bilan farq qiladi?

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.

Extension generic bo'lishi mumkinmi?

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 qanday ta'sir qiladi?

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

  • Extension computed properties, metodlar, protokollar va subskriptlar qo'shadi
  • Stored properties taqiqlangan — extension xotira ajratmaydi
  • Protocol conformance extension orqali — Swift-da kodni tashkil etish standarti
  • Open/Closed Principle — tur kengaytirish uchun ochiq, o'zgartirish uchun yopiq
  • Generic extensions where clauses bilan ixtisoslashgan xatti-harakat beradi
  • Readability — extensions mantiqni protokollar va funksiyalar bo'yicha guruhlaydi

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.

Loyihani muhokama qilish

Shuningdek o'qing