Protocol у Swift-у — шта је, синтакса и могућности

Аутор: IT Sectr Објављено: 2026-06-17 Време читања: 6 мин

Protocol у Swift-у — уговор који дефинише скуп захтева које сваки тип који га прихвати мора да испуни. Протоколи су основа протокол-оријентисаног програмирања (POP) — парадигме коју Apple препоручује за Swift уз класично ООП. Према Apple Documentation, 2026, структуре, класе и еnum могу прихватити протоколе, што чини архитектуру флексибилном и тестирабилном.

Главно

  • Protocol — уговор са захтевима за структуре, класе и enum
  • Requirements укључују методе, својства, иницијализаторе и субскрипте
  • Protocol Composition омогућава комбиновање више протокола
  • POP — протокол-оријентисано програмирање, алтернатива наслеђивању
  • Protocol Extensions додају подразумеване имплементације за методе

Шта је Protocol у Swift-у?

Protocol — апстрактни интерфејс који дефинише шта тип треба да уме, али не и како то ради. У Swift-у, протокол је аналоган интерфејсима из Java или Go, али са додатним могућностима.

Протокол може захтевати:

  • Методе инстанце и типа (статичке)
  • Својства са спецификатором { get } или { get set }
  • Иницијализаторе
  • Субскрипте
  • Associated types (генерици на нивоу протокола)

Према WWDC 2015, Apple је представио Protocol-Oriented Programming као фундаментални приступ архитектури Swift апликација. За разлику од ООП, где наслеђивање класа ствара круте хијерархије, POP предлаже композицију протокола. Ово даје флексибилност: један тип може одговарати више протокола, добијајући њихове захтеве и имплементације кроз extensions.

Синтакса декларисања протокола

Protocol се декларише кључном речи protocol са именом и телом.

swift
protocol Drawable {
    func draw(context: CGContext)
    var boundingBox: CGRect { get }
}

Тип прихвата протокол кроз двотачку после имена:

swift
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 }.

swift
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 може наследити други протокол, додајући нове захтеве. Ово ствара хијерархију уговора без крутог повезивања са класама.

swift
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

Protocol Composition — механизам који омогућава навођење да тип мора одговарати више протокола истовремено, без креирања новог комбинованог протокола.

swift
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 као тип

Protocol се може користити као тип променљиве, параметра функције или елемента колекције. Ово се назива existential type.

swift
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, програмери често праве неколико понављајућих грешака.

  • Заборављено mutating — метода у протоколу означена као mutating, а структура је имплементира без кључне речи
  • Protocol as type уместо generic — коришћење Drawable уместо <T: Drawable> тамо где је потребан конкретан тип
  • Circular protocol reference — протокол који се позива на себе кроз associated type, без коректног решења
  • Class-only protocol — коришћење AnyObject без потребе, што искључује struct и enum

Често постављана питања

По чему се protocol разликује од abstract class?

Protocol дефинише само захтеве без имплементације (до protocol extensions). Abstract class може садржати имплементацију и стање. У Swift-у нема апстрактних класа — њихову улогу имају протоколи са extensions.

Може ли struct прихватити protocol?

Да, структуре, класе и еnum — сви могу прихватити протоколе. То је основа POP: нисте обавезни да користите класе за организовање архитектуре. Структуре са протоколима дају семантику вредности и имутабилност.

Шта је associated type у протоколу?

Associated type (associatedtype) — плацехолдер за тип који имплементирајући тип сам одређује. Пример: Collection има associatedtype Element. Ово је generic на нивоу протокола.

Може ли се протокол ограничити само за класе?

Да, додајте наслеђивање од AnyObject: protocol MyProtocol: AnyObject. Тада само класе могу прихватити овај протокол. Ово је корисно за weak референце и делегате.

Како проверити усклађеност са протоколом у runtime?

Користите is за проверу и as? за претварање: if let drawable = item as? Drawable. Ово ради само за протоколе без associated types.

Резиме

  • Protocol — уговор за методе, својства, иницијализаторе и субскрипте
  • Class, struct, enum — сви типови могу прихватити протоколе
  • Наслеђивање протокола ствара хијерархију уговора без крутог повезивања
  • Protocol Composition (&) комбинује протоколе без наслеђивања
  • Existential types (any) и opaque types (some) — два начина рада са протоколима
  • POP препоручен од Apple-а као алтернатива класичном наслеђивању класа
  • Protocol Extensions омогућавају додавање подразумеваних имплементација

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође