Protocol — bu nima, iOS protokollari va delegatlari

Muallif: IT Sectr Nashr etilgan: 2026-02-18 O'qish vaqti: 10 daq

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 — struktur, sinf yoki enum amalga oshirishi kerak bo'lgan interfeysni belgilaydigan kontrakt
  • Protocol-Oriented Programming — protokollar va protokol kengaytmalari chuqur merosxo'rlik ierarxiyasini almashtiradigan Swift paradigmasi
  • Protocol extension — metodlarning standart amalga oshirilishi, @objc holda protokol metodlarini ixtiyoriy qiladi
  • Associated types — har xil ma'lumot turlari bilan type-safe ishlash uchun assotsiatsiyalangan turlarga ega umumlashtirilgan protokollar
  • Protocol composition — & operatori orqali bir nechta protokollarni birlashtirib talablarni aniq tasvirlash

Swift-da protokol nima?

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.

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

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.

AspektPOP (Protocol-Oriented)OOP (Class-based)
Abstraktsiya birligiProtocolBaza sinf
Qayta foydalanishProtocol extensionMerosxo'rlik
Value typesQo'llab-quvvatlanadi (struct)Faqat reference types
Ko'p marta qo'llashProtocol compositionKo'p merosxo'rlik (Swift da yo'q)
Bog'liqlik xavfiPast (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.

Protocol vs abstract class vs interface

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.

XususiyatSwift ProtocolJava InterfaceC++ Abstract Class
Metodlarni amalga oshirishHa (extension)Ha (default methods)Ha
Saqlangan xususiyatlarYo'qYo'qHa
Value typesHaYo'qYo'q
Ko'p martalik amalga oshirishHaHaHa
InitsializatorlarHa (talablar)Yo'qHa

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.

Protokollarda Associated Types va Generics

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.

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 {
    // 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 va protokol kengaytmalari

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.

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("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.

Objective-C da @protocol: Swift dan farqlar

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

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

Protokol abstrakt sinfdan nimasi bilan farq qiladi?

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.

Protocol-Oriented Programming nima?

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.

Protokol boshqa protokolni meros qilib olishi mumkinmi?

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.

Protokollar kontekstida any va some nima?

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.

Swift da protokolga muvofiqlikni qanday tekshirish mumkin?

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

  • Protocol — amalga oshiruvchi tip uchun xususiyatlar, metodlar, initsializatorlar va subscript ga talablarni belgilaydigan kontrakt
  • Protocol-Oriented Programming sinf merosxo'rligini kengaytmalar bilan protokol kompozitsiyasi bilan almashtiradi
  • Protocol extension standart amalga oshirishni ta'minlab, metodlarni @objc holda ixtiyoriy qiladi
  • Associated types turni amalga oshirish tomonida aniqlashtirish bilan umumlashtirilgan protokollar yaratishga imkon beradi
  • Protocol composition & orqali bir nechta protokol talablarini birlashtiradi
  • Objective-C @protocol sinflar bilan cheklangan va associated types, generics va value types ni qo'llab-quvvatlamaydi
  • Tavsiya: Swift da asosiy abstraktsiya vositasi sifatida protokollardan foydalaning, sinflarni faqat reference semantics kerak bo'lganda qo'llang

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.

Loyihani muhokama qilish

Shuningdek o'qing