.count }.reduce(0, +) return Int(round(Double(size) / Double(count.toIntMax()))) } }

Zdaj lahko izračunamo povprečno velikost katere koli zbirke čakalnih vrst (Array, Set itd.). Brez razširitev protokola bi morali to metodo dodati vsaki vrsti zbirke posebej.

V standardni knjižnici Swift se za razširitev protokola uporabljajo na primer metode, kot so map, filter, reduce itd.

kako narediti programiranje na c ++ -
extension Collection { public func map(_ transform: (Self.Iterator.Element) throws -> T) rethrows -> [T] { } }

Razširitve protokola in polimorfizem

Kot sem že omenil, nam razširitve protokolov omogočajo dodajanje privzetih izvedb nekaterih metod in dodajanje novih izvedb metod. Kakšna pa je razlika med tema dvema značilnostma? Vrnimo se k upravljavcu napak in ugotovimo.

protocol ErrorHandler { func handle(error: Error) } extension ErrorHandler { func handle(error: Error) { print(error.localizedDescription) } } struct Handler: ErrorHandler { func handle(error: Error) { fatalError('Unexpected error occurred') } } enum ApplicationError: Error { case other } let handler: Handler = Handler() handler.handle(error: ApplicationError.other)

Rezultat je usodna napaka.

Zdaj odstranite handle(error: Error) izjava metode iz protokola.

protocol ErrorHandler { }

Rezultat je enak: usodna napaka.

Ali to pomeni, da ni razlike med dodajanjem privzete izvedbe metode protokola in dodajanjem nove izvedbe metode protokolu?

Ne! Razlika obstaja in to lahko vidite, če spremenite vrsto spremenljivke handler od Handler do ErrorHandler.

let handler: ErrorHandler = Handler()

Zdaj je izhod v konzolo: Operacije ni bilo mogoče dokončati. (Napaka ApplicationError 0.)

Če pa protokolu vrnemo deklaracijsko metodo ročaja (error: Error), se bo rezultat spremenil nazaj v usodno napako.

protocol ErrorHandler { func handle(error: Error) }

Oglejmo si vrstni red dogajanja v posameznem primeru.

Ko v protokolu obstaja izjava metode:

Protokol označuje handle(error: Error) metoda in zagotavlja privzeto izvedbo. Metoda je razveljavljena v Handler izvajanje. Torej se med izvajanjem prikliče pravilna izvedba metode, ne glede na vrsto spremenljivke.

Če izjava metode v protokolu ne obstaja:

Ker metoda ni deklarirana v protokolu, je tip ne more preglasiti. Zato je izvedba klicane metode odvisna od vrste spremenljivke.

Če je spremenljivka tipa Handler, se pokliče izvedba metode iz tipa. Če je spremenljivka tipa ErrorHandler, se pokliče izvedba metode iz razširitve protokola.

Protokolsko usmerjena koda: varna, a izrazita

V tem članku smo pokazali nekaj moči razširitev protokola v Swiftu.

Za razliko od drugih programskih jezikov z vmesniki, Swift ne omejuje protokolov z nepotrebnimi omejitvami. Swift se ukvarja s splošnimi domislicami teh programskih jezikov, tako da razvijalcu omogoča, da po potrebi razreši dvoumnosti.

S protokoli Swift in razširitvami protokolov je koda, ki jo napišete, lahko tako izrazita kot večina dinamičnih programskih jezikov in je v času prevajanja še vedno varna za tip. To vam omogoča, da zagotovite ponovno uporabo in vzdrževanje kode ter da bolj samozavestno spreminjate kodno bazo aplikacije Swift.

Upamo, da vam bo ta članek koristen in pozdravljamo kakršne koli povratne informacije ali nadaljnja spoznanja.