Swift-də Protocol — nədir, sintaksis və imkanları

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

Protocol Swift-də — hər hansı bir tipin qəbul etməli olduğu tələblər toplusunu müəyyən edən kontraktdır. Protokollar protokol-yönümlü proqramlaşdırmanın (POP) əsasını təşkil edir — Apple tərəfindən Swift üçün klassik OOP ilə yanaşı tövsiyə olunan paradiqma. Apple Documentation, 2026-ya görə, strukturlar, siniflər və enum protokolları qəbul edə bilər ki, bu da arxitekturanı çevik və test edilə bilən edir.

Əsas məqamlar

  • Protocol — strukturlar, siniflər və enum üçün tələblər kontraktı
  • Requirements metodlar, xassələr, initilizatorlar və subskriptləri əhatə edir
  • Protocol Composition bir neçə protokolu birləşdirməyə imkan verir
  • POP — protokol-yönümlü proqramlaşdırma, miras almaya alternativ
  • Protocol Extensions metodlar üçün standart implementasiyalar əlavə edir

Swift-də Protocol nədir?

Protocol — tipin nə edə bilməli olduğunu müəyyən edən, lakin bunu necə edəcəyini göstərməyən abstrakt interfeysdir. Swift-də protokol Java və ya Go-dakı interfeyslərin analoqudur, lakin əlavə imkanları ilə.

Protokol tələb edə bilər:

  • Metodlar nümunə və tip (statik)
  • Xassələr { get } və ya { get set } ilə
  • İnitilizatorlar
  • Subskriptlər
  • Associated types (protokol səviyyəsində generiklər)

WWDC 2015-ə görə, Apple Protocol-Oriented Programming-i Swift tətbiqlərinin arxitekturasına fundamental yanaşma kimi təqdim etdi. OOP-dan fərqli olaraq, sinif miras alması sərt iyerarxiyalar yaradır, POP isə protokolların kompozisiyasını təklif edir. Bu çeviklik verir: bir tip bir neçə protokola uyğun ola bilər, onların tələblərini və implementasiyalarını extensions vasitəsilə əldə edərək.

Protokolların elan edilmə sintaksisi

Protocol protocol açar sözü ilə ad və bədənlə elan edilir.

swift
protocol Drawable {
    func draw(context: CGContext)
    var boundingBox: CGRect { get }
}

Tip protokolu addan sonra iki nöqtə vasitəsilə qəbul edir:

swift
struct Circle: Drawable {
    let center: CGPoint
    let radius: CGFloat

    func draw(context: CGContext) {
        context.addArc(center: center, radius: radius, ...)
    }

    var boundingBox: CGRect {
        CGRect(x: center.x - radius, y: center.y - radius,
               width: radius * 2, height: radius * 2)
    }
}

Bir tip vergüllə ayrılmış bir neçə protokolu qəbul edə bilər: struct MyType: ProtocolA, ProtocolB. Kompilyator hər protokolun bütün tələblərinin yerinə yetirildiyini yoxlayır.

Metod və xassə tələbləri

Property requirements var açar sözü və { get } və ya { get set } giriş spesifikatorları ilə göstərilir.

swift
protocol UserProtocol {
    var name: String { get }
    var age: Int { get set }
    static var maxAge: Int { get }
    mutating func updateName(_ newName: String)
}

Protokolda mutating açar sözü metodun self-i dəyişə biləcəyini bildirir. Strukturlar belə metodu mutating kimi implementasiya etməlidir, siniflər isə bunu buraxa bilər. Method requirements parametr etiketləri də daxil olmaqla tam imza ilə göstərilir.

Protokolların miras alınması

Protocol başqa bir protokolu miras alaraq yeni tələblər əlavə edə bilər. Bu, siniflərə sərt bağlılıq olmadan kontrakt iyerarxiyası yaradır.

swift
protocol Vehicle {
    var speed: Double { get set }
    func move()
}

protocol Flyable: Vehicle {
    var altitude: Double { get set }
    func takeOff()
}

Flyable-i qəbul edən tip hər iki protokolun — həm Vehicle, həm də Flyable-in tələblərini yerinə yetirməlidir. Swift protokolların çoxsaylı miras alınmasını dəstəkləyir: protocol A: B, C.

Protocol Composition

Protocol Composition — tipin eyni anda bir neçə protokola uyğun olmasını tələb etməyə imkan verən mexanizm, yeni kombinasiya protokolu yaratmadan.

swift
func render(_ item: Drawable & Animatable) {
    item.draw(context: ...)
    item.animate(duration: 0.3)
}

Composition (&) funksiya parametrlərində, dəyişənlərdə və generic məhdudiyyətlərində işləyir. Kompilyator ötürülən tipin eyni anda bütün protokolları təmin etdiyini yoxlayır. Composition SwiftUI-də tez-tez istifadə olunur: some View — bu composition ilə genericdir.

Protocol Composition miras iyerarxiyası yaratmaqdan üstündür: protocol A: B, C əvəzinə birbaşa B & C qəbul edilə bilər. Bu çeviklik verir və bağlılığı azaldır. Composition xüsusilə funksiya parametrlərində və generic məhdudiyyətlərində rahatdır, burada müvəqqəti olaraq tələbləri aralıq protokol yaratmadan birləşdirmək lazımdır. Bu, kodda köməkçi tiplərin sayını azaldır.

Protocol tip kimi

Protocol dəyişən tipi, funksiya parametri və ya kolleksiya elementi kimi istifadə edilə bilər. Buna existential type deyilir.

swift
var drawableItem: Drawable
let items: [Drawable] = [Circle(...), Rectangle(...)]

func process(drawables: [any Drawable]) {
    for item in drawables {
        item.draw(context: ...)
    }
}

any (Swift 5.6+) açar sözü existential-i açıq şəkildə göstərir. any olmadan kompilyator xəbərdarlıq verir. Swift həmçinin some (opaque types) dəstəkləyir ki, bu da konkret tipi protokol arxasında gizlətmək üçündür — SwiftUI-də standart texnikadır.

Protokollarla tipik səhvlər

Protocol ilə işləyərkən tərtibatçılar tez-tez bir neçə təkrarlanan səhvə yol verirlər.

  • Unudulmuş mutating — protokolda metod mutating kimi qeyd olunub, lakin struktur onu açar söz olmadan implementasiya edir
  • Generic əvəzinə Protocol as type — konkret tip lazım olan yerdə <T: Drawable> əvəzinə Drawable istifadəsi
  • Circular protocol reference — associated type vasitəsilə özünə istinad edən protokol, düzgün həll edilmədən
  • Class-only protocol — ehtiyac olmadan AnyObject istifadəsi, struct və enum-u istisna edir

Tez-tez verilən suallar

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

Protocol yalnız implementasiyasız tələbləri müəyyən edir (protocol extensions-a qədər). Abstract class implementasiya və vəziyyət ehtiva edə bilər. Swift-də abstrakt siniflər yoxdur — onların rolunu extensions ilə protokollar yerinə yetirir.

Struct protocol qəbul edə bilərmi?

Bəli, strukturlar, siniflər və enum — hamısı protokolları qəbul edə bilər. Bu POP-un əsasıdır: arxitektura təşkili üçün siniflərdən istifadə etmək məcburiyyətində deyilsiniz. Protokollu strukturlar dəyər semantikası və dəyişməzlik təmin edir.

Protokolda associated type nədir?

Associated type (associatedtype) — implementasiya edən tipin özü tərəfindən müəyyən edilən tip üçün placeholder. Nümunə: Collection-un associatedtype Element-i var. Bu protokol səviyyəsində genericdir.

Protokolu yalnız siniflər üçün məhdudlaşdırmaq olar?

Bəli, AnyObject-dən miras əlavə edin: protocol MyProtocol: AnyObject. O zaman yalnız siniflər bu protokolu qəbul edə bilər. Bu zəif istinadlar və delegate-lər üçün faydalıdır.

Runtime-da protokola uyğunluğu necə yoxlamaq olar?

Yoxlamaq üçün is, çevirmək üçün as? istifadə edin: if let drawable = item as? Drawable. Bu yalnız associated type olmayan protokollar üçün işləyir.

Xülasə

  • Protocol — metodlar, xassələr, initilizatorlar və subskriptlər üçün kontrakt
  • Class, struct, enum — bütün tiplər protokolları qəbul edə bilər
  • Miras protokolların sərt bağlılıq olmadan kontrakt iyerarxiyası yaradır
  • Protocol Composition (&) miras olmadan protokolları birləşdirir
  • Existential types (any) və opaque types (some) — protokollarla işin iki yolu
  • POP Apple tərəfindən klassik sinif miras almasına alternativ olaraq tövsiyə olunur
  • Protocol Extensions standart implementasiyalar əlavə etməyə imkan verir

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