Protocol у Swift-у — уговор који дефинише скуп захтева које сваки тип који га прихвати мора да испуни. Протоколи су основа протокол-оријентисаног програмирања (POP) — парадигме коју Apple препоручује за Swift уз класично ООП. Према Apple Documentation, 2026, структуре, класе и еnum могу прихватити протоколе, што чини архитектуру флексибилном и тестирабилном.
Главно
Protocol — апстрактни интерфејс који дефинише шта тип треба да уме, али не и како то ради. У Swift-у, протокол је аналоган интерфејсима из Java или Go, али са додатним могућностима.
Протокол може захтевати:
{ get } или { get set }Према WWDC 2015, Apple је представио Protocol-Oriented Programming као фундаментални приступ архитектури Swift апликација. За разлику од ООП, где наслеђивање класа ствара круте хијерархије, POP предлаже композицију протокола. Ово даје флексибилност: један тип може одговарати више протокола, добијајући њихове захтеве и имплементације кроз extensions.
Protocol се декларише кључном речи protocol са именом и телом.
protocol Drawable {
func draw(context: CGContext)
var boundingBox: CGRect { get }
}
Тип прихвата протокол кроз двотачку после имена:
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)
}
}
Један тип може прихватити више протокола одвојених зарезом: struct MyType: ProtocolA, ProtocolB. Компајлер проверава да ли су сви захтеви сваког протокола испуњени.
Property requirements се наводе кључном речи var и спецификаторима приступа { get } или { get set }.
protocol UserProtocol {
var name: String { get }
var age: Int { get set }
static var maxAge: Int { get }
mutating func updateName(_ newName: String)
}
Кључна реч mutating у протоколу значи да метода може мењати self. Структуре морају имплементирати такву методу као mutating, класе могу изоставити. Method requirements се наводе са комплетним потписом, укључујући етикете параметара.
Protocol може наследити други протокол, додајући нове захтеве. Ово ствара хијерархију уговора без крутог повезивања са класама.
protocol Vehicle {
var speed: Double { get set }
func move()
}
protocol Flyable: Vehicle {
var altitude: Double { get set }
func takeOff()
}
Тип који прихвата Flyable мора испунити захтеве оба протокола — и Vehicle и Flyable. Swift подржава вишеструко наслеђивање протокола: protocol A: B, C.
Protocol Composition — механизам који омогућава навођење да тип мора одговарати више протокола истовремено, без креирања новог комбинованог протокола.
func render(_ item: Drawable & Animatable) {
item.draw(context: ...)
item.animate(duration: 0.3)
}
Composition (&) ради у параметрима функција, променљивим и генеричким ограничењима. Компајлер проверава да прослеђени тип истовремено задовољава све протоколе. Composition се често користи у SwiftUI: some View — то је generic са composition.
Protocol Composition је пожељнији од креирања хијерархије наслеђивања: уместо protocol A: B, C може се прихватити директно B & C. Ово даје флексибилност и смањује повезаност. Composition је посебно згодан у параметрима функција и генеричким ограничењима, где треба привремено спојити захтеве без креирања посредног протокола. Ово смањује број помоћних типова у коду.
Protocol се може користити као тип променљиве, параметра функције или елемента колекције. Ово се назива existential type.
var drawableItem: Drawable
let items: [Drawable] = [Circle(...), Rectangle(...)]
func process(drawables: [any Drawable]) {
for item in drawables {
item.draw(context: ...)
}
}
Кључна реч any (Swift 5.6+) експлицитно указује на existential. Без any компајлер даје упозорење. Swift такође подржава some (opaque types) за скривање конкретног типа иза протокола — то је стандардна техника у SwiftUI.
При раду са protocol, програмери често праве неколико понављајућих грешака.
Drawable уместо <T: Drawable> тамо где је потребан конкретан типAnyObject без потребе, што искључује struct и enumЧесто постављана питања
Protocol дефинише само захтеве без имплементације (до protocol extensions). Abstract class може садржати имплементацију и стање. У Swift-у нема апстрактних класа — њихову улогу имају протоколи са extensions.
Да, структуре, класе и еnum — сви могу прихватити протоколе. То је основа POP: нисте обавезни да користите класе за организовање архитектуре. Структуре са протоколима дају семантику вредности и имутабилност.
Associated type (associatedtype) — плацехолдер за тип који имплементирајући тип сам одређује. Пример: Collection има associatedtype Element. Ово је generic на нивоу протокола.
Да, додајте наслеђивање од AnyObject: protocol MyProtocol: AnyObject. Тада само класе могу прихватити овај протокол. Ово је корисно за weak референце и делегате.
Користите is за проверу и as? за претварање: if let drawable = item as? Drawable. Ово ради само за протоколе без associated types.
Резиме
&) комбинује протоколе без наслеђивањаany) и opaque types (some) — два начина рада са протоколимаРазвићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође