Protocol — bu ma'lum bir protokolni amalga oshiradigan tip rioya qilishi kerak bo'lgan talablar (xususiyatlar va metodlar) to'plamidir. Swift-da protokollar Protocol-Oriented Programming (POP) ning markaziy elementi bo'lib, merosxo'rliksiz polimorfizmni amalga oshirishga imkon beradi. Swift.org (2025) ma'lumotlariga ko'ra, protokollar Swift standart kutubxonasining 85% turlarida qo'llaniladi. Objective-C da @protocol o'xshash rol o'ynaydi, ammo cheklash bilan — faqat sinflar uchun.
Asosiy fikrlar
Protocol Swift-da — bu tip bajarishi kerak bo'lgan talablarni belgilaydigan abstrakt interfeysdir. Protokol xususiyatlar (getter/setter bilan), metodlar (namuna va tip), initsializatorlar va subscript talab qilishi mumkin. Sinflardan farqli o'laroq, protokollar strukturalar, enumlar va sinflar tomonidan amalga oshirilishi mumkin — bu sof sinfga asoslangan tillarda mavjud bo'lmagan moslashuvchanlikni beradi.
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 strukturasi Drawable protokolini amalga oshiradi, boundingRect xususiyati va draw(in:) metodini taqdim etadi. Protokol tufayli Drawable-ni amalga oshiradigan har qanday shakl bir xilda qayta ishlanishi mumkin — bu umumiy baza sinfidan merosxo'rliksiz polimorfizmdir.
Protocol-Oriented Programming (POP) — Apple tomonidan WWDC 2015 da sinf merosxo'rligiga muqobil sifatida taklif qilingan paradigmadir. POP da protokollar asosiy abstraktsiya vositasi bo'lib, protokol kengaytmalari (protocol extensions) standart amalga oshirishni ta'minlaydi. Bu «rombusimon merosxo'rlik» muammosini hal qiladi va mavjud turlarni manba kodini o'zgartirmasdan kengaytirishga imkon beradi.
| Aspekt | POP (Protocol-Oriented) | OOP (Class-based) |
|---|---|---|
| Abstraktsiya birligi | Protocol | Baza sinf |
| Qayta foydalanish | Protocol extension | Merosxo'rlik |
| Value types | Qo'llab-quvvatlanadi (struct) | Faqat reference types |
| Ko'p marta qo'llash | Protocol composition | Ko'p merosxo'rlik (Swift da yo'q) |
| Bog'liqlik xavfi | Past (zaif bog'liqlik) | Yuqori (qattiq ierarxiya) |
Apple Swift blog (2025) ma'lumotlariga ko'ra, strukturalar zamonaviy Swift ilovalarida turlarning 70% ni tashkil qiladi. POP bu o'zgarishning asosiy sababidir: protokollar strukturalarga sinflarga o'tmasdan polimorf xatti-harakatga ega bo'lish imkonini beradi.
Swift protokollari Java interfeyslari va C++ abstrakt sinflari o'rtasida oraliq pozitsiyani egallaydi. Ular amalga oshirishni o'z ichiga olishi mumkin (extension orqali), lekin holatga (saqlangan xususiyatlarga) ega emas. Farqlarni uch til misolida ko'rib chiqamiz.
| Xususiyat | Swift Protocol | Java Interface | C++ Abstract Class |
|---|---|---|---|
| Metodlarni amalga oshirish | Ha (extension) | Ha (default methods) | Ha |
| Saqlangan xususiyatlar | Yo'q | Yo'q | Ha |
| Value types | Ha | Yo'q | Yo'q |
| Ko'p martalik amalga oshirish | Ha | Ha | Ha |
| Initsializatorlar | Ha (talablar) | Yo'q | Ha |
Asosiy farq: Swift Protocol initsializatorlar va subscript talab qilishi mumkin, bu Java Interface da mavjud emas. Protokol esa holatni saqlay olmaydi — bu protokolni amalga oshiradigan tipning vakolatida qoladi.
Associated Type (assotsiatsiyalangan tip) — protokol ichidagi umumlashtirilgan tip bo'lib, amalga oshiruvchi tip tomonidan aniqlashtiriladi. Bu ma'lum bir ma'lumot turini ko'rsatmasdan type-safe protokollar yaratishga imkon beradi. Assotsiatsiyalangan turlar Swift generics bilan birga ishlaydi.
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 {
// funksiya tanasi
}Container — associatedtype Item bo'lgan protokol. IntStack uni amalga oshiradi, typealias Item = Int belgilaydi. sum generik-funksiyasi faqat raqamli konteynerlar bilan ishlash uchun where-cheklovidan foydalanadi. Associated types protokollarni type-safe likni yo'qotmasdan umumlashtirilgan qiladi.
Protocol composition — & operatori orqali bir nechta protokollarni birlashtirish. Kompozitsiyaga mos keladigan tip birlashtirilgan barcha protokollarni amalga oshirishi kerak. Bu Swift da mavjud bo'lmagan ko'p merosxo'rlikni almashtiradi va funksiya parametrlariga talablarni aniq belgilashga imkon beradi.
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("Salom, \(entity.name), yosh \(entity.age)!")
}
// Protocol extension — standart amalga oshirish
extension Named {
func introduce() {
print("Mening ismim \(name)")
}
}Protocol extension metodlarning standart amalga oshirilishini ta'minlaydi. Protokolni amalga oshiradigan tip extension metodini override qilishi mumkin — bu holda uning o'z amalga oshirilishi chaqiriladi. Bu Swift ning @objc holda ixtiyoriy metodlarni amalga oshirish mexanizmidir.
@protocol Objective-C da — Swift Protocol ning o'tmishdoshi, ammo muhim cheklovlar bilan. Objective-C protokollari faqat sinflar uchun mavjud (strukturalar yoki enumlar uchun emas) va message passing orqali dinamik jo'natishdan foydalanadi. Metodlar @required (standart) yoki @optional bo'lishi mumkin.
@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 dan farqli o'laroq, Objective-C protokollari associated types, generics, protocol extensions va value types ni qo'llab-quvvatlamaydi. Ular sinf abstraktsiyasi mexanizmi bo'lib qoladi, Swift Protocol esa barcha turlar uchun to'liq huquqli polimorfizm vositasidir.
Tez-tez beriladigan savollar
Protocol holatni (saqlangan xususiyatlarni) saqlay olmaydi — faqat xususiyatlarga talablar qo'yadi. Abstract class ma'lumotli maydonlarni o'z ichiga olishi mumkin. Protocol strukturalar va enumlar tomonidan amalga oshirilishi mumkin, abstract class — faqat sinflar tomonidan. Swift da protokollar asosiy abstraktsiya vositasidir, sinflar kamroq ishlatiladi.
POP — protokollar va protokol kengaytmalari chuqur merosxo'rlik ierarxiyalarini almashtiradigan paradigmadir. Barcha pastki sinflar merosxo'r bo'lgan baza sinf o'rniga, POP extension orqali standart amalga oshirishlar bilan protokol kompozitsiyasidan foydalanadi. Bu bog'liqlikni kamaytiradi va kodning qayta ishlatilishini oshiradi.
Ha, Swift protokollari merosxo'rlikni qo'llab-quvvatlaydi. protocol SerializableDrawable: Drawable, Codable — Drawable va Codable talablarini birlashtiradigan protokol. SerializableDrawable-ni amalga oshiradigan tip ierarxiyadagi barcha protokollarning talablarini bajarishi kerak. Bu sinf merosxo'rligidan farq qiladi — protokollarning umumiy ajdodi yo'q.
some (opaque type) funksiyaning protokolga mos keladigan bitta aniq turni qaytarishini kafolatlaydi. any (existential type) protokolga mos keladigan istalgan turni saqlashga imkon beradi. some turning identifikatorini saqlash uchun, any — geterogen kollektsiyalar uchun ishlatiladi. some Swift 5.1 da, any Swift 5.7 da paydo bo'ldi.
Tekshirish uchun is, o'zgartirish uchun as? dan foydalaning: if let drawable = object as? Drawable { drawable.draw(in: ctx) }. Objective-C da conformsToProtocol: ishlatiladi. Swift associated types bo'lmagan protokollar uchun is-tekshirishni ham qo'llab-quvvatlaydi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.