Swift-də Extension: nədir, sintaksis və metodları necə əlavə etmək olar

Müəllif: IT Sectr Dərc olunub: 2026-06-18 Oxuma vaxtı: 6 dəq

Extension Swift-də mövcud tiplərə onların mənbə kodunu dəyişmədən yeni funksionallıq əlavə etməyə imkan verən mexanizmdir. Genişləndirmələr metodlar, hesablanan xassələr, inizializatorlar, subskriptlər, iç-içə tiplər və protokolların tətbiqini dəstəkləyir. Apple Documentation, 2026-ya görə, genişləndirmələr Swift layihələrində kodun təşkili və Open/Closed prinsipinə riayət etmək üçün əsas vasitədir.

Əsas məqamlar

  • Extension — orijinalı dəyişmədən mövcud tiplərə funksionallıq əlavə etmək
  • Computed properties — extension vasitəsilə əlavə edilir, stored — yox
  • Protocol conformance — istənilən tip üçün extension vasitəsilə protokol tətbiqi
  • Kodun təşkili — extensions əlaqəli məntiqi protokollara görə qruplaşdırır
  • Open/Closed — extensions genişlənməyə açıqlıq prinsipini həyata keçirir

Swift-də Extension nədir?

Extension Swift-də mövcud tipi (sinif, struktur, enum, protokol) yeni imkanlarla genişləndirməyə imkan verən dil konstruksiyasıdır. Bu, Objective-C-dəki kateqoriyaların analoqudur, lakin daha çox imkanlara malikdir.

Extension əlavə edə bilər:

  • Hesablanan xassələr nümunə və tip üçün
  • Metodlar nümunə və tip üçün
  • İnitializatorlar (convenience init)
  • Subskriptlər
  • İç-içə tiplər
  • Protocol conformances

Apple sənədlərinə görə, extension mövcud metodları (dynamic dispatch) ləğv edə bilməz və stored properties əlavə edə bilməz. Bu məhdudiyyətlər orijinal tipin bütövlüyünü qoruyur.

Genişləndirmələrin sintaksisi

Extension açar sözü extension ilə genişləndirilən tip göstərilərək elan edilir.

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

Yalnız öz tiplərinizi deyil, həm də Swift, Foundation, UIKit və digər framework-lərin standart kitabxana tiplərini genişləndirə bilərsiniz. Bu, extension-u domain-specific funksionallıq əlavə etmək üçün güclü vasitəyə çevirir.

Extension vasitəsilə metodların əlavə edilməsi

Extension istənilən mövcud tipə nümunə və tip metodları əlavə etməyə imkan verir.

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"

Mutasiya edən metodlar dəyər tiplərini (struct, enum) genişləndirir və self-i dəyişə bilər. Siniflər üçün mutasiya tələb olunmur. Extension hətta standart kitabxana tiplərinə də mutasiya edən metodlar əlavə edə bilər.

Extension-da Computed Properties

Extension yalnız hesablanan xassələr əlavə edə bilər — stored properties qadağandır. Bu məntiqlidir: extension orijinal tipin yaddaşını idarə etmir.

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 saat sonra gələcəkdir)

Extension-da computed properties əsas tətbiqdə olduğu kimi eyni qaydalara tabedir: { get }{ get set } xassələri yaradıla bilər. Swift bir tip üçün extension sayına məhdudiyyət qoymur. Bir tip üçün müxtəlif fayllarda istədiyiniz qədər extension elan edə bilərsiniz — bu böyük layihələrdə standart təcrübədir.

Extension vasitəsilə protokolların tətbiqi

Extension protokolların tətbiqi üçün üstünlük verilən üsuldur. Tipin əsas elanını qarışdırmaq əvəzinə, protokolun bütün metodları ayrıca extension-da yerləşdirilir.

swift
struct User {
    let id: Int
    let name: String
    let email: String
}

// Protokola görə Extension — təmiz ayrılma
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 yanaşma məsuliyyəti bölür: əsas struktur yalnız stored properties ehtiva edir, extensions isə protokolların tətbiqini. Swift hətta nəzarət etmədiyimiz tiplər üçün extension vasitəsilə protokol tətbiqinə icazə verir.

Extension və kodun təşkili

Extension təkcə dil imkanı deyil, həm də arxitektura təşkili alətidir. Extensions-dən düzgün istifadə kodu oxunaqlı və asan idarə olunan edir.

  • Protokollara görə qruplaşdırma — hər protokol ayrıca extension-da
  • Markalar (MARK)// MARK: - Equatable naviqasiya üçün
  • Faylların bölünməsi — müxtəlif protokollar üçün extensions ayrı fayllarda
  • Private helpers — extension-da özəl metodlar private ilə qeyd olunur
swift
// MARK: - User + Displayable
extension User: Displayable {
    var displayName: String {
        return "\(name) (\(email))"
    }
}

Swift API Design Guidelines-ə görə, extensions oxunaqlılığı yaxşılaşdırır: tərtibatçı məlumat strukturunu əsas elanda, məntiqi isə extensions-da görür. Bu, interfeysin ayrılması prinsipinə (Interface Segregation) uyğundur.

Where-məhdudiyyətli extension metodları yalnız müəyyən tiplər üçün əlavə edir: extension Array where Element: Equatable { func isUnique() -> Bool }. Belə kod yığcam və tip təhlükəsizdir — isUnique metodu yalnız Equatable elementləri olan massivlərdə görünür, kompilyasiya mərhələsində səhvləri aradan qaldırır və API-ni digər tərtibatçılar üçün daha təmiz, təhlükəsiz və başa düşülən edir.

Tez-tez verilən suallar

Extension stored properties əlavə edə bilərmi?

Xeyr, extension stored properties əlavə edə bilməz. Bu məhdudiyyət əsasdır: extension tip nümunəsi üçün yaddaş ayrılmasında iştirak etmir. Stored properties üçün tipin əsas elanından istifadə edin.

Extension vasitəsilə mövcud metodu ləğv etmək olarmı?

Xeyr, extension metodları ləğv edə bilməz. Mövcud metodla eyni imzaya malik metodu elan etmək cəhdi kompilyasiya xətasına səbəb olacaq. Ləğv etmək üçün sinif irsiliyindən istifadə edin.

Extension subclassing-dən nə ilə fərqlənir?

Extension yeni tip yaratmadan funksionallıq əlavə edir. Subclassing iyerarxiya yaradır və ləğvi dəstəkləyir. Extension mənbə koduna giriş tələb etmir və bütün tiplərlə işləyir.

Extension generic ola bilərmi?

Bəli, extension generic ola bilər, əgər genişləndirilən tip generic-dirsə: extension Array where Element: Numeric. Extension daxilində öz tip parametrləri ilə generic metodlar da əlavə etmək olar.

Extension performansa necə təsir edir?

Extension performansa təsir etmir — extension metodları adi metodlar kimi kompilyasiya olunur. Extension ilə protokollar üçün static dispatch istifadə olunur, bu siniflərin dynamic dispatch-indən daha sürətli ola bilər.

Xülasə

  • Extension computed properties, metodlar, protokollar və subskriptlər əlavə edir
  • Stored properties qadağandır — extension yaddaş ayırmır
  • Protocol conformance extension vasitəsilə — Swift-də kod təşkilinin standartı
  • Open/Closed Principle — tip genişlənməyə açıq, dəyişikliyə qapalıdır
  • Generic extensions where clauses ilə ixtisaslaşdırılmış davranış verir
  • Readability — extensions məntiqi protokollara və funksiyalara görə qruplaşdırır

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun