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 — 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 adi extension kimi elan edilir, lakin tipin adı əvəzinə protokolun adı ilə.
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:
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.
Default implementation — protocol extension-ın əsas tətbiqi. Tip öz versiyasını təmin edərək metodu əvəz edə bilər.
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.
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.
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:
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:
where Self: Equatablewhere Element == Stringwhere Element: Numeric, Element: ComparableBu, protocol extension-ı protokolun ümumi tətbiqini çirklənmədən ixtisaslaşdırılmış davranış əlavə etmək üçün güclü bir mexanizm edir.
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.
| Xarakteristika | Protocol Extension | Sinif mirası |
|---|---|---|
| Value types | Struct və enum ilə işləyir | Yalnız siniflər |
| Çoxsaylı tətbiq | Tip çox protokol qəbul edə bilər | Bir superklass |
| Vəziyyət | Stored properties yoxdur | Stored properties ola bilər |
| Dispetçerizasiya | Static 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
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.
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.
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 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.
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
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.
Həm də oxuyun