Protocol — bu nədir, iOS-da protokollar və deleqatlar

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

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 — struktur, sinif və ya enum-un həyata keçirməli olduğu interfeysi təyin edən kontrakt
  • Protocol-Oriented Programming — protokolların və protokol genişləndirmələrinin dərin miras iyerarxiyasını əvəz etdiyi Swift paradiqması
  • Protocol extension — metodların defolt icrası, @objc olmadan protokol metodlarını isteğe bağlı edir
  • Associated types — müxtəlif data tipləri ilə tip-təhlükəsiz iş üçün assosiasiya olunmuş tiplərlə ümumiləşdirilmiş protokollar
  • Protocol composition — & operatoru ilə bir neçə protokolu birləşdirərək tələblərin dəqiq təsviri

Swift-də protokol nədir?

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.

Swift
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: Swift paradiqması

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.

AspektPOP (Protocol-Oriented)OOP (Class-based)
Abstraksiya vahidiProtocolBaza sinif
Təkrar istifadəProtocol extensionMiras
Value typesDəstəklənir (struct)Yalnız reference types
Çoxlu tətbiqProtocol compositionÇoxlu miras (Swift-də yox)
Bağlılıq riskiAş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.

Protocol vs abstract class vs interface

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ətSwift ProtocolJava InterfaceC++ Abstract Class
Metodların icrasıBəli (extension)Bəli (default methods)Bəli
Saxlanılan xassələrXeyrXeyrBəli
Value typesBəliXeyrXeyr
Çoxsaylı icraBəliBəliBəli
İnisializatorlarBəli (tələblər)XeyrBə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.

Protokollarda Associated Types və Generics

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.

Swift
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 və protokol genişləndirmələri

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.

Swift
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.

Objective-C-də @protocol: Swift-dən fərqlər

@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.

Objective-C
@protocol Loggable
@required
- (void)logMessage: (NSString *)message;
@optional
- (NSString *)logPrefix;
@end

@interface ConsoleLogger : NSObject 
@end

@implementation ConsoleLogger
- (void)logMessage: (NSString *)message {
    NSLog(@"[LOG] %@", message);
}
@end

Swift-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

Protokol abstract class-dan nə ilə fərqlənir?

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.

Protocol-Oriented Programming nədir?

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.

Protokol başqa protokolu miras ala bilərmi?

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.

Protokollar kontekstində any və some nədir?

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ı.

Swift-də protokola uyğunluğu necə yoxlamaq olar?

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ə

  • Protocol — həyata keçirən tip üçün xassələrə, metodlara, inisializatorlara və subscript-ə tələbləri təyin edən kontrakt
  • Protocol-Oriented Programming sinif mirasını genişləndirmələrlə protokol kompozisiyası ilə əvəz edir
  • Protocol extension defolt implementasiya təmin edir, metodları @objc olmadan isteğe bağlı edir
  • Associated types tipin konkretləşdirilməsi ilə ümumiləşdirilmiş protokollar yaratmağa imkan verir
  • Protocol composition & vasitəsilə bir neçə protokolun tələblərini birləşdirir
  • Objective-C @protocol siniflərlə məhdudlaşır və associated types, generics və value types dəstəkləmir
  • Tövsiyə: Swift-də əsas abstraksiya aləti kimi protokollardan istifadə edin, sinifləri yalnız reference semantics lazım olduqda tətbiq edin

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