Protocol Swift-da — har qanday qabul qiluvchi tip bajarishi kerak bo'lgan talablar to'plamini belgilaydigan kontraktdir. Protokollar protokol-yo'naltirilgan dasturlash (POP) asosini tashkil qiladi — Apple tomonidan Swift uchun klassik OOP bilan birga tavsiya qilingan paradigmadir. Apple Documentation, 2026 ma'lumotlariga ko'ra, strukturalar, sinflar va enum protokollarni qabul qilishi mumkin, bu arxitekturani moslashuvchan va sinovdan o'tkaziladigan qiladi.
Asosiy nuqtalar
Protocol — bu tip nima qila olishi kerakligini belgilaydigan, lekin buni qanday qilishini ko'rsatmaydigan mavhum interfeysdir. Swift-da protokol Java yoki Go-dagi interfeyslarning analogidir, ammo qo'shimcha imkoniyatlar bilan.
Protokol talab qilishi mumkin:
{ get } yoki { get set } bilanWWDC 2015 ma'lumotlariga ko'ra, Apple Protocol-Oriented Programming-ni Swift ilovalari arxitekturasiga fundamental yondashuv sifatida taqdim etdi. OOP-dan farqli o'laroq, sinf merosi qattiq ierarxiyalar yaratadi, POP esa protokollar kompozitsiyasini taklif qiladi. Bu moslashuvchanlik beradi: bir tip bir nechta protokollarga mos kelishi mumkin, ularning talablari va implementatsiyalarini extensions orqali oladi.
Protocol protocol kalit so'zi bilan nom va tana bilan e'lon qilinadi.
protocol Drawable {
func draw(context: CGContext)
var boundingBox: CGRect { get }
}
Tip protokolni nomdan keyin ikki nuqta orqali qabul qiladi:
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 vergul bilan ajratilgan bir nechta protokollarni qabul qilishi mumkin: struct MyType: ProtocolA, ProtocolB. Kompilyator har bir protokolning barcha talablari bajarilganligini tekshiradi.
Property requirements var kalit so'zi va { get } yoki { get set } kirish spesifikatorlari bilan ko'rsatiladi.
protocol UserProtocol {
var name: String { get }
var age: Int { get set }
static var maxAge: Int { get }
mutating func updateName(_ newName: String)
}
Protokolda mutating kalit so'zi metod self-ni o'zgartirishi mumkinligini bildiradi. Strukturalar bunday metodni mutating sifatida implementatsiya qilishi kerak, sinflar esa buni o'tkazib yuborishi mumkin. Method requirements parametr teglarini ham o'z ichiga olgan to'liq imzo bilan ko'rsatiladi.
Protocol boshqa protokolni meros olib, yangi talablar qo'shishi mumkin. Bu sinflarga qattiq bog'lanmagan kontrakt iyerarxiyasini yaratadi.
protocol Vehicle {
var speed: Double { get set }
func move()
}
protocol Flyable: Vehicle {
var altitude: Double { get set }
func takeOff()
}
Flyable-ni qabul qiluvchi tip ikkala protokolning — ham Vehicle, ham Flyable-ning talablarini bajarishi kerak. Swift protokollarning ko'p meros olishini qo'llab-quvvatlaydi: protocol A: B, C.
Protocol Composition — bu tip bir vaqtning o'zida bir nechta protokollarga mos kelishi kerakligini belgilash mexanizmi, yangi kombinatsiya protokolini yaratmasdan.
func render(_ item: Drawable & Animatable) {
item.draw(context: ...)
item.animate(duration: 0.3)
}
Composition (&) funksiya parametrlarida, o'zgaruvchilarda va generic cheklovlarida ishlaydi. Kompilyator uzatilgan tipning bir vaqtning o'zida barcha protokollarni qondirishini tekshiradi. Composition SwiftUI-da tez-tez ishlatiladi: some View — bu composition bilan generic.
Protocol Composition meros iyerarxiyasi yaratishdan afzal: protocol A: B, C o'rniga to'g'ridan-to'g'ri B & C qabul qilinishi mumkin. Bu moslashuvchanlik beradi va bog'liqlikni kamaytiradi. Composition ayniqsa funksiya parametrlarida va generic cheklovlarida qulay, bu erda vaqtinchalik talablarni oraliq protokol yaratmasdan birlashtirish kerak. Bu koddagi yordamchi tiplar sonini kamaytiradi.
Protocol o'zgaruvchi tipi, funksiya parametri yoki kolleksiya elementi sifatida ishlatilishi mumkin. Bu existential type deb ataladi.
var drawableItem: Drawable
let items: [Drawable] = [Circle(...), Rectangle(...)]
func process(drawables: [any Drawable]) {
for item in drawables {
item.draw(context: ...)
}
}
any (Swift 5.6+) kalit so'zi existential-ni aniq ko'rsatadi. any bo'lmasa, kompilyator ogohlantirish beradi. Swift shuningdek some (opaque types) ni qo'llab-quvvatlaydi, bu aniq tipni protokol orqasida yashirish uchun — SwiftUI-dagi standart texnika.
Protocol bilan ishlaganda, dasturchilar tez-tez bir nechta takrorlanuvchi xatolarga yo'l qo'yishadi.
<T: Drawable> o'rniga Drawable ishlatishAnyObject ishlatish, struct va enum-ni istisno qiladiTez-tez beriladigan savollar
Protocol faqat talablarni implementatsiyasiz belgilaydi (protocol extensions-gacha). Abstract class implementatsiya va holatni o'z ichiga olishi mumkin. Swift-da mavhum sinflar yo'q — ularning rolini extensions bilan protokollar bajaradi.
Ha, strukturalar, sinflar va enum — barchasi protokollarni qabul qilishi mumkin. Bu POP asosidir: arxitekturani tashkil qilish uchun sinflardan foydalanish shart emas. Protokolli strukturalar qiymat semantikasi va o'zgarmaslikni ta'minlaydi.
Associated type (associatedtype) — implementatsiya qiluvchi tip o'zi belgilaydigan tip uchun placeholder. Misol: Collection associatedtype Element-ga ega. Bu protokol darajasida generic.
Ha, AnyObject-dan meros qo'shing: protocol MyProtocol: AnyObject. U holda faqat sinflar bu protokolni qabul qilishi mumkin. Bu zaif havolalar va delegatlar uchun foydali.
Tekshirish uchun is, o'zgartirish uchun as? dan foydalaning: if let drawable = item as? Drawable. Bu faqat associated type bo'lmagan protokollar uchun ishlaydi.
Xulosa
&) merossiz protokollarni birlashtiradiany) va opaque types (some) — protokollar bilan ishlashning ikki usuliBiz 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.