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

Nüüd saame arvutada mis tahes järjekordade keskmise suuruse (Array, Set jne). Ilma protokollilaienditeta oleksime pidanud selle meetodi lisama igale kollektsiooni tüübile eraldi.

Swifti standardraamatukogus kasutatakse protokollilaiendeid näiteks selliste meetodite rakendamiseks nagu map, filter, reduce jne.

mis on välisvaluutarisk
extension Collection { public func map(_ transform: (Self.Iterator.Element) throws -> T) rethrows -> [T] { } }

Protokollilaiendid ja polümorfism

Nagu ma varem ütlesin, võimaldavad protokollilaiendid lisada mõne meetodi vaikerakendusi ja lisada ka uusi meetodite juurutusi. Kuid mis on nende kahe omaduse erinevus? Minge tagasi veakäitleja juurde ja uurige seda.

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)

Tulemuseks on saatuslik viga.

Nüüd eemaldage handle(error: Error) meetodi deklaratsioon protokollist.

protocol ErrorHandler { }

Tulemus on sama: saatuslik viga.

Kas see tähendab, et protokollimeetodi vaikimisi rakendamise ja uue meetodi juurutamise lisamise vahel pole vahet?

Ei! Erinevus on olemas ja seda näete muutuja handler tüübi muutmisega alates Handler kuni ErrorHandler.

let handler: ErrorHandler = Handler()

Nüüd on konsooli väljund: Toimingut ei õnnestunud lõpule viia. (Viga ApplicationError 0.)

Kuid kui tagastame protokolli käepideme (tõrge: viga) deklaratsiooni, muutub tulemus tagasi fataalseks veaks.

protocol ErrorHandler { func handle(error: Error) }

Vaatame järjestust, mis juhtub igal juhul.

Kui protokollis on meetodi deklaratsioon:

Protokoll kuulutab handle(error: Error) meetod ja pakub vaikimisi rakendamist. Meetod tühistatakse Handler -s rakendamine. Niisiis, sõltuvalt muutuja tüübist, käivitatakse käitamise ajal meetodi õige rakendamine.

Kui meetodi deklaratsiooni protokollis pole:

Kuna meetodit pole protokollis deklareeritud, ei saa tüüp seda alistada. Sellepärast sõltub kutsutud meetodi rakendamine muutuja tüübist.

Kui muutuja tüüp on Handler, kutsutakse meetodi juurutamist tüübist. Juhul, kui muutuja tüüp on ErrorHandler, kutsutakse meetodi juurutamist protokollilaiendist.

Protokollile orienteeritud kood: turvaline, kuid samas väljendusrikas

Selles artiklis demonstreerisime Swiftis mõnda protokollilaiendite jõudu.

Erinevalt teistest liidestega programmeerimiskeeltest ei piira Swift protokolle tarbetute piirangutega. Swift töötab nende programmeerimiskeelte tavaliste probleemide ümber, võimaldades arendajal vajadusel ebaselgust lahendada.

Swifti protokollide ja protokollilaienditega võib teie kirjutatav kood olla sama väljendusrikas kui enamik dünaamilisi programmeerimiskeeli ja olla kompileerimise ajal ikkagi tüübikindel. See võimaldab teil tagada oma koodi korduvkasutatavuse ja hooldatavuse ning muuta oma Swifti rakenduse koodibaasi enesekindlamalt.

Loodame, et see artikkel on teile kasulik ja tervitame tagasisidet või lisateavet.