Protocol — müəyyən bir protokolu həyata keçirən tipin uyğun gəlməli olduğu tələblər (xassələr və metodlar) toplusudur. Swift-də protokollar Protocol-Oriented Programming (POP)-in mərkəzi elementidir və miras olmadan polimorfizmi həyata keçirməyə imkan verir. Swift.org (2025) məlumatına görə, protokollar Swift standart kitabxanasının 85% tipində istifadə olunur. Objective-C-də @protocol oxşar rol oynayır, ancaq məhdudiyyətlə — yalnız siniflər üçün.
Əsas məqamlar
Protocol Swift-də — tipin uyğun gəlməli olduğu tələbləri təyin edən abstrakt interfeysdir. Protokol xassələr (getter/setter ilə), metodlar (instans və tip), inisializatorlar və subscript tələb edə bilər. Siniflərdən fərqli olaraq, protokollar strukturlar, enumlar və siniflər tərəfindən həyata keçirilə bilər — bu, sırf sinif əsaslı dillərdə olmayan çeviklik verir.
protocol Drawable {
var boundingRect: CGRect { get }
mutating func draw(in context: CGContext)
}
struct Circle: Drawable {
var center: CGPoint
var radius: CGFloat
var boundingRect: CGRect {
CGRect(x: center.x - radius, y: center.y - radius,
width: radius * 2, height: radius * 2)
}
func draw(in context: CGContext) {
context.addEllipse(in: boundingRect)
}
}Circle strukturu Drawable protokolunu həyata keçirir, boundingRect xassəsi və draw(in:) metodu təqdim edir. Protokol sayəsində Drawable-ı həyata keçirən istənilən fiqur vahid şəkildə işlənə bilər — bu, ümumi baza sinfindən miras olmadan polimorfizmdir.
Protocol-Oriented Programming (POP) — Apple tərəfindən WWDC 2015-də sinif mirasına alternativ olaraq təklif edilmiş paradiqmadır. POP-da protokollar əsas abstraksiya vasitəsidir, protokol genişləndirmələri (protocol extensions) isə defolt implementasiya təmin edir. Bu, «rombvari miras» problemini həll edir və mövcud tipləri mənbə kodunu dəyişmədən genişləndirməyə imkan verir.
| Aspekt | POP (Protocol-Oriented) | OOP (Class-based) |
|---|---|---|
| Abstraksiya vahidi | Protocol | Baza sinif |
| Təkrar istifadə | Protocol extension | Miras |
| Value types | Dəstəklənir (struct) | Yalnız reference types |
| Çoxlu tətbiq | Protocol composition | Çoxlu miras (Swift-də yox) |
| Bağlılıq riski | Aşağı (zəif bağlılıq) | Yüksək (sərt iyerarxiya) |
Apple Swift blog (2025) məlumatına görə, strukturlar müasir Swift tətbiqlərində tiplərin 70%-ni təşkil edir. POP bu dəyişimin əsas səbəbidir: protokollar strukturlara siniflərə keçmədən polimorf davranış əldə etməyə imkan verir.
Swift protokolları Java interfeysləri ilə C++ abstrakt sinifləri arasında aralıq mövqe tutur. Onlar implementasiya ehtiva edə bilər (extension vasitəsilə), lakin vəziyyəti (saxlanılan xassələri) yoxdur. Fərqləri üç dil nümunəsində izah edək.
| Xüsusiyyət | Swift Protocol | Java Interface | C++ Abstract Class |
|---|---|---|---|
| Metodların icrası | Bəli (extension) | Bəli (default methods) | Bəli |
| Saxlanılan xassələr | Xeyr | Xeyr | Bəli |
| Value types | Bəli | Xeyr | Xeyr |
| Çoxsaylı icra | Bəli | Bəli | Bəli |
| İnisializatorlar | Bəli (tələblər) | Xeyr | Bəli |
Əsas fərq: Swift Protocol inisializatorlar və subscript tələb edə bilər, bu Java Interface-də mövcud deyil. Protokol isə vəziyyəti saxlaya bilməz — bu protokolu həyata keçirən tipin səlahiyyətində qalır.
Associated Type (assosiasiya olunmuş tip) — protokol daxilində ümumiləşdirilmiş tipdir və həyata keçirən tip tərəfindən konkretləşdirilir. Bu, konkret data tipini göstərmədən tip-təhlükəsiz protokollar yaratmağa imkan verir. Assosiasiya olunmuş tiplər Swift generics ilə birlikdə işləyir.
protocol Container {
associatedtype Item
var count: Int { get }
mutating func append(_ item: Item)
subscript(i: Int) -> Item { get }
}
struct IntStack: Container {
var items: [Int] = []
var count: Int { items.count }
typealias Item = Int
mutating func append(_ item: Int) {
items.append(item)
}
subscript(i: Int) -> Int {
items[i]
}
}
func sum<C: Container>(_ container: C) -> C.Item where C.Item: Numeric {
// funksiyanın gövdəsi
}Container — associatedtype Item olan protokoldur. IntStack onu həyata keçirir, typealias Item = Int təyin edir. sum generik-funksiyası yalnız ədədi konteynerlərlə işləmək üçün where-məhdudiyyətindən istifadə edir. Associated types protokolları tip-təhlükəsizliyini itirmədən ümumiləşdirilmiş edir.
Protocol composition — & operatoru ilə bir neçə protokolun birləşdirilməsidir. Kompozisiyaya uyğun tip birləşdirilmiş bütün protokolları həyata keçirməlidir. Bu, Swift-də olmayan çoxlu mirası əvəz edir və funksiya parametrlərinə tələbləri dəqiq müəyyən etməyə imkan verir.
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct Person: Named, Aged {
let name: String
let age: Int
}
func greet(_ entity: Named & Aged) {
print("Salam, \(entity.name), yaş \(entity.age)!")
}
// Protocol extension — defolt implementasiya
extension Named {
func introduce() {
print("Mənim adım \(name)")
}
}Protocol extension metodların defolt implementasiyasını təmin edir. Protokolu həyata keçirən tip extension metodunu override edə bilər — bu halda onun öz implementasiyası çağırılır. Bu, Swift-in @objc olmadan isteğe bağlı metodları həyata keçirmə mexanizmidir.
@protocol Objective-C-də — Swift Protocol-un sələfidir, lakin əhəmiyyətli məhdudiyyətlərlə. Objective-C protokolları yalnız siniflər üçün əlçatandır (strukturlar və ya enumlar üçün yox) və message passing vasitəsilə dinamik göndərmədən istifadə edir. Metodlar @required (defolt) və ya @optional ola bilər.
@protocol Loggable
@required
- (void)logMessage: (NSString *)message;
@optional
- (NSString *)logPrefix;
@end
@interface ConsoleLogger : NSObject
@end
@implementation ConsoleLogger
- (void)logMessage: (NSString *)message {
NSLog(@"[LOG] %@", message);
}
@endSwift-dən fərqli olaraq, Objective-C protokolları associated types, generics, protocol extensions və value types dəstəkləmir. Onlar sinif abstraksiyası mexanizmi olaraq qalır, Swift Protocol isə bütün tiplər üçün tamhüquqlu polimorfizm alətidir.
Tez-tez verilən suallar
Protocol vəziyyəti (saxlanılan xassələri) saxlaya bilməz — yalnız xassələrə tələblər qoya bilər. Abstract class məlumat olan sahələr ehtiva edə bilər. Protocol strukturlar və enumlar tərəfindən həyata keçirilə bilər, abstract class — yalnız siniflər tərəfindən. Swift-də protokollar əsas abstraksiya vasitəsidir, siniflər daha az istifadə olunur.
POP — protokolların və protokol genişləndirmələrinin dərin miras iyerarxiyalarını əvəz etdiyi paradiqmadır. Bütün alt siniflərin miras aldığı baza sinif əvəzinə, POP extension vasitəsilə defolt implementasiyalarla protokol kompozisiyasından istifadə edir. Bu, bağlılığı azaldır və kodun təkrar istifadəsini artırır.
Bəli, Swift protokolları mirası dəstəkləyir. protocol SerializableDrawable: Drawable, Codable — Drawable və Codable tələblərini birləşdirən protokoldur. SerializableDrawable-ı həyata keçirən tip iyerarxiyadakı bütün protokolların tələblərini yerinə yetirməlidir. Bu, sinif mirasından fərqlənir — protokolların ümumi əcdadı yoxdur.
some (opaque type) funksiyanın protokola uyğun bir konkret tip qaytarmasına zəmanət verir. any (existential type) protokola uyğun istənilən tipi saxlamağa imkan verir. some tipin kimliyini qorumaq üçün, any — heterogen kolleksiyalar üçün istifadə olunur. some Swift 5.1-də, any Swift 5.7-də ortaya çıxdı.
Yoxlama üçün is, çevirmə üçün as? istifadə edin: if let drawable = object as? Drawable { drawable.draw(in: ctx) }. Objective-C-də conformsToProtocol: istifadə olunur. Swift associated types olmayan protokollar üçün is-yoxlamasını da dəstəkləyir.
Nəticə
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