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 — 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:
{ get } və ya { get set } ilə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.
Protocol protocol açar sözü ilə ad və bədənlə elan edilir.
protocol Drawable {
func draw(context: CGContext)
var boundingBox: CGRect { get }
}
Tip protokolu addan sonra iki nöqtə vasitəsilə qəbul edir:
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.
Property requirements var açar sözü və { get } və ya { get set } giriş spesifikatorları ilə göstərilir.
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.
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.
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 — tipin eyni anda bir neçə protokola uyğun olmasını tələb etməyə imkan verən mexanizm, yeni kombinasiya protokolu yaratmadan.
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 dəyişən tipi, funksiya parametri və ya kolleksiya elementi kimi istifadə edilə bilər. Buna existential type deyilir.
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.
Protocol ilə işləyərkən tərtibatçılar tez-tez bir neçə təkrarlanan səhvə yol verirlər.
<T: Drawable> əvəzinə Drawable istifadəsiAnyObject istifadəsi, struct və enum-u istisna edirTez-tez verilən suallar
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.
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.
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.
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.
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ə
&) miras olmadan protokolları birləşdirirany) və opaque types (some) — protokollarla işin iki yoluAç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