Swift-də Protocol Extension: bu nədir və necə istifadə etməli

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

Protocol Extension — Swift mexanizmi, protokol üçün metodların və xassələrin standart tətbiqini təmin etməyə imkan verir. Where məhdudiyyətləri ilə birlikdə protocol extension, yalnız müəyyən şərtlərə cavab veren tiplərə davranış əlavə etməyə imkan verir. Apple Documentation, 2026-ya görə, bu, sinif iyerarxiyası olmadan kodu təkrar istifadə etməyə imkan veren protokol-yönümlü proqramlaşdırmanın açar elementidir.

Başlıca

  • Protocol Extension — protokol üçün standart metod tətbiqi
  • Default implementation tiplərdə kod təkrarlanmasının qarşısını alır
  • Where clauses extension-i yalnız müəyyən tiplərlə məhdudlaşdırır
  • Overriding — tip standart yerinə öz tətbiqini təmin edə bilər
  • POP — protocol extensions OOP-dən baza siniflərini əvəz edir

Protocol Extension nədir?

Protocol Extension — bu, mövcud protokola metodların və hesablanan xassələrin tətbiqini əlavə etmək yoludur. Extensionsiz protokol yalnız tələbləri müytəyyən edir və hər tip onları müstəqil şəkildə tətbiq edir.

Protocol Extension kod təkrarlanması problemini həll edir: əgər beş strukturnər eyni protokolu qəbul edir və eyni metodu tətbiq edirsə, extension standart tətbiqi bir dəfə təmin edir.

Swift Evolution proposal SE-0186-ya görə, protocol extensions POP-un uğurunu müytəyyən edən açar imkanlardan biridir. Onlar baza sinifləri yaratmadan və tək məsuliyyət prinsipini pozmadan ümumi davranış əlavə etməyə imkan verir.

Protocol extension sintaksisi

Protocol Extension adi extension kimi elan edilir, lakin tipin adı əvəzinə protokolun adı ilə.

swift
protocol Greetable {
    var name: String { get }
    func greet() -> String
}

extension Greetable {
    func greet() -> String {
        return "Hello, \(name)!"
    }
}

Indi Greetable qəbul edən istənilən tip avtomatik olaraq greet tətbiqini alır:

swift
struct Person: Greetable {
    let name: String
}
// Person avtomatik olaraq greet() var

let user = Person(name: "Alice")
print(user.greet()) // “Hello, Alice!”

Protocol Extension hesablanan xassələr ehtiva edə bilər, lakin stored properties yox (protokollar yaddaşı müytəyyən edə bilməz). Siz həmçinin extension vasitəsilə subscripts və iç-içə tiplər əlavə edə bilərsiniz.

Standart metodların tətbiqi

Default implementation — protocol extension-ın əsas tətbiqi. Tip öz versiyasını təmin edərək metodu əvəz edə bilər.

swift
protocol Loggable {
    func log(message: String)
}

extension Loggable {
    func log(message: String) {
        print("[Default] \(message)")
    }
}

struct ConsoleLogger: Loggable {}
// Standart tətbiqdən istifadə edir

struct FileLogger: Loggable {
    func log(message: String) {
        // Xüsusi tətbiq standartı əvəz edir
        writeToFile(message)
    }
}

Sinif mirasından vacib fərq: əgər tip protokolun metodunu özü tətbiq edirsə, onun tətbiqi çağrılır. Yoxdursa — extension-dan standart istifadə olunur. Bu statik dispetçerizasiyadır, qərar kompilyasiya mərhələsində verilir.

Protocol extension-da where məhdudiyyətləri

Where clause protocol extension-ı yalnız əlavə şərtlərə cavab verən tiplərlə məhdudlaşdırmağa imkan verir. Bu, ixtisaslaşdırılmış davranış əlavə etmək üçün güclü bir mexanizmdir.

swift
protocol Printable {
    var content: String { get }
}

extension Printable where Self: CustomStringConvertible {
    func debugPrint() -> String {
        return "[Printable] \(content)"
    }
}

Burada debugPrint yalnız həm Printable, həm də CustomStringConvertible tətbiq edən tiplər üçün mövcuddur. Swift standart kitabxanası bu nümunədən geniş istifadə edir — məsələn, Collection where Element üçün extension.

Xüsusilə tip bərabərliyi məhdudiyyəti olan where clauses faydalıdır:

swift
extension Collection where Element == String {
    func commaJoined() -> String {
        return self.joined(separator: ", ")
    }
}

let words = ["Swift", "Kotlin", "Java"]
print(words.commaJoined()) // “Swift, Kotlin, Java”

Bu mexanizm protocol extension-ı seçici edir: commaJoined metodu yalnız sətir kolleksiyaları üçün mövcuddur, lakin ədədi kolleksiyalar üçün yox. Kompilyator məhdudiyyətləri statik olaraq yoxlayır.

Where constraints yoxlaya bilər:

  • Uyğunluq protokola: where Self: Equatable
  • Məhdudiyyət tipi: where Element == String
  • Kombinasiyalar: where Element: Numeric, Element: Comparable

Bu, protocol extension-ı protokolun ümumi tətbiqini çirklənmədən ixtisaslaşdırılmış davranış əlavə etmək üçün güclü bir mexanizm edir.

Protocol Extensions vs miras

Bir çox tərtibatçı sual verir: nə vaxt protocol extensions, nə vaxt isə sinif mirası istifadə edilməlidir? Cavab arxitektura paradiqmasından asılıdır.

XarakteristikaProtocol ExtensionSinif mirası
Value typesStruct və enum ilə işləyirYalnız siniflər
Çoxsaylı tətbiqTip çox protokol qəbul edə bilərBir superklass
VəziyyətStored properties yoxdurStored properties ola bilər
DispetçerizasiyaStatic dispatch (standart)Dynamic dispatch (virtual cədvəllər)

Apple protocol + extension ilə başlamağı və yalnız paylaşılan vəziyyət və ya identity (reference semantics) lazım olduqda siniflərə keçməyi tövsiyə edir. Protocol extensions miras əvəzinə kompozisiya təmin edir — daha çevik və test edilə bilən yanaşma.

Təcrübədə protocol extensions tez-tez protokol tələbləri üzərində rahat sarıcı metodlar əlavə etmək üçün istifadə olunur. Məsələn, əgər protokol validate metodunu tələb edirsə, extension tam versiya əsasında məntiqi dəyər qaytaran isValid metodu əlavə edə bilər. Bu, protokol müqaviləsini dəyişdirmədən müştəri kodunu sadələşdirir. Bu nümunə «default implementation ilə derived API» adlanır və Swift standart kitabxanasında və məşhur üçüncü tərəf freymvorklarda geniş istifadə olunur. Bu, təsirdə olan protokol-yönümlü proqramlaşdırmanın açar texnikalarından biridir və çevik arxitekturanın əsasıdır.

Tez-tez verilən suallar

Protocol extension stored property-yə sahib ola bilərmi?

Xeyr, protocol extension yalnız hesablanan xassələri ehtiva edə bilər. Stored properties qadağandır, çünki protokol yaddaşa sahib deyil — konkret tip (struct, class, enum) məlumatların saxlanmasına cavabdehdir.

Protocol Extension əvəz etmə zamanı tətbiqi necə seçir?

Statik dispetçerizasiya istifadə olunur: əgər tip metodu açıq şəkildə tətbiq edirsə — onun versiyası çağrılır. Yoxdursa — extension-dan standart. Existential (any) vasitəsilə müraciət edərkən dynamic dispatch tətbiq olunur.

Protocol extension-da convenience init əlavə etmək olarmı?

Bəli, protocol extension initləşdiricilər ehtiva edə bilər. Lakin protokol extension vasitəsilə init tələb edə bilməz — tələb protokolun elanında olmalıdır, tətbiq isə tipdə.

Protocol extension konkret tip üçün extension-dan nə ilə fərqlənir?

Protocol extension protokolu qəbul edən bütün tiplərə tətbiq olunur. Tip üçün extension — yalnız bir konkret tipə. Protocol extension miras olmadan polimorfizm təmin edir.

Protocol extension-i başqa extension-un içinə yerləşdirmək olarmı?

Xeyr, Swift iç-içə protocol extensions-i qadağan edir. Hər protocol extension fayl səviyyəsində elan edilir. Kodu təşkil etmək üçün // MARK: işaretləri və ayrı fayllardan istifadə edin.

Nəticələr

  • Protocol Extension — protokolu qəbul edən bütün tiplər üçün standart metod tətbiqi
  • Where clause extension-i yalnız müəyyən tiplərlə məhdudlaşdırır
  • Default implementation tiplər arasında kod təkrarlanmasını aradan qaldırır
  • Computed properties icazə verilir, stored properties — yox
  • Static dispatch — tip metodu əvəz etməyibsə, standart tətbiq çağrılır
  • POP protocol extensions ilə mirası əvəz edir və arxitekturanı daha çevik edir

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