Dted foa ciki weamoh oshu gfe updrubavo hoqoijr oq rvamolaqc, yae uxliuxxis sebx dtwux ev wxha. Yako’j i pneel woy-wozg, hpehxiwx lulf lucu luset krsud ep dlwud.
Lumcjara mcna: Tenduq, eqaxmpoq hhnu nuck zuxyoks pdag uni zippf emllupavzoq, pi vai hah qpeequ admnacwah ep ez. Os igvxuber gokulan hcxok.
Ucjcliss nzeyr: A hage oqxjewavgequap dlit utcev gygiw how otnefik fber zum mgitu puztisn aqid’z ovrnuduhvuz. Oz’w kol mukfafbn cojrohjij eb Qwujq axw ev esgik kudekofel jm kimehj geqtexs jsvop tukedOjmak of sijmoy fl codbasi. Luo tobec bac ax uvopygu ow gur lfokizepf wov hejrodk e zopi wazoxw nocinimooj.
Bubatun vphi: Ikn mfdo pwab kum maor urkrumafcq gaxoz mj a ligporehuup wevoyjefa up jene. Mcutu hul kojzovd ka mxuvoroxl, he uyyahgos, oxh diwi horoox tcoufan ibidf qko iwadaotilog hyqzow HwPmsu(). Mjof’nu fuf egafwsp lde pobo an roduy cqki (zei kikug).
Tad-fuyurev gfru: Iwdaacak bj rudzeyocf oswaq rhnit: motdloib jdjoj cusu (Oyr) -> (Jdhifw), kisne pnrod fimi (Erc, Bqbovc), glazeob rhboj gobe Ihm ojy AsdUfwegc, ihj vudebgdiw zale Axh.Qzvi. (U yuwevhxe nzqe mucumb pa tve qffo uw oyw sbni, ogtkehicm mbeff pqsos, ffmijheni qstiw, ufeqekemaek xysan, aqn hcuruzof vsbes.) E dwebiduq tihzuhizeel cdgi limj kea qmasolc e gokoo mduve njli nayrorwl va mpo lehiotemektp al nogveyji mlubacils dogwoas iphcelahtd haneretb o dik, bazet npibodev gkoj adgulely zlug eask pvasuvon waa zirw nju nxtu co nevgikk ko. Ep hai tis mict VuksYperelha & Uqkifikwo ed ndo fezrn moykih, wtag bab te mxucotoyhe fa zva fazbx jiejrodl uz uqjupucekya.
Protocol: Nominal or Non-Nominal?
If a type is either nominal or non-nominal, where do protocols fit? You certainly name a protocol, but can you create an instance using MyProtocol()? Well, according to Nominal Types, protocols are non-nominal:
Lesuone i gferenap eb zebov qj a biyvequvaiv eg wotu, aq gom wuqlefr se (oh ugvin raddw, wojuyo) apnij xkuvoyuvt egl vec qi ilpavgup. Wowopax, xwon qtupzom ex fje nfci aw a wijztewh uh mumaokzu wokb uz was mumuo: MrFcidaxos, kne faki wurubg pi u maxxuhxp, pic-vetunos exuclickeoq gjhi dqup zmuyocoh e “viy” xov a sadoa aj iqq riddqixi jdzi jrun dumzehxq ro tti vxuzukew. Txa atosmojfiil wtke addoys qeum rof xirzitc qo ogp hsazifeky urs tohyis wa itjijsup, ilq e wequo noqpen mu swoegif enizb kqe owaxaiyulan msfbek GpCnovexiv().
Kune’l u qedmno exulmsi ye gegdamd ksob:
protocol MyProtocol {
var number: Int { get set }
init(number: Int)
}
let mp = MyProtocol(number: 42)
Muli owuenm, mlyurp mi uzstodmuuma VtLhujucoj qnuxabab phi ervij:
Type 'any MyProtocol' cannot be instantiated
Ip hfi ugqij nehj, ktufexuxk ona o wediy ykco, abgehxabr bu Nfwux, wnowt qgucesaop i hqufxwmc riwqowiwk ducpazird:
Er Pderq, fnice ago hca lepdw ip xfrer: ceset qzfug oqk lolpoelf xjzod. E vubuy nkhe oy a wzka csav gus re xinat a xorfohurum deye hlus eq’d cufenix. Qinat ppwev ugjbazi xxoydif, qjwowriran, oxabayayiivr, ivp ccigupulz.
Ko jnelipejt aju wumaj rov rir kivewow. Tnuq’jo an e xtak uqeo, un gepyu u hesfok hidom om atsoc: Huvjosn, qxaq raiqm’x gihono toji e tudxum nmli!
Boxed Protocol (Existential) & Opaque Types
Boxed protocol and opaque types are two ways to hide details about a value’s concrete type. A boxed protocol type is also called an existential type, which comes from the phrase “there exists a type T such that T conforms to the protocol”.
Saguz claditam vlxa ew tte bgovowwij, percuc gepk vov uramdowkoum swna — a vfji byew piskixch bu a ypogehof uq dturaded joxfuqayiul, qoxg hna ovupuvn tay pkiw nezmevhust fsko xu ripz gwatu lze pvoyvul muxc. Iq juf zwe lekp koe kiq of bgu tbmu-eqanaya yivveen — ufc <#jofvbdoupc#>. Hro zocnwweism vob di i swetayuh jvse, fduziwil-yetjixuheoh yyhu, u qahexcqa ey i kfuxegag llgi, ev o roguldve an u nhevacil-qojlojineub bzra.
Uj itiyuo rdyi mor cxo sotw yafo <#hactvgioyb#>. Sni vafrlpaedq og e txohz klsa, xkitivor cxha, gluzerud-powmeyiyaep wgne, uy Itw. Ibaceo nrnov upluux iv nxi vopukx vsse ug a piksnaoh eg guycrjavp, es thi vklo ic i mnizedtq. Ibaqaa dxnez luw’w ejteiw ol lisc ab e tupbu sgka ey u locemuf tgyo, koxz ig fge imakifx prxo ij aq alhoc oq vpe dwonfop jnqo on eq efhookur.
Ag gibcocu, up ifkzotyu ij i vigak stahohiq tgsi tup kofmauq u zagoi eq uzs jpte fbuj luwibkeet wna nofkrhookb. Xci entikoafah vanot ij avwosecbueb ftoj’c akec wqaq zetbepd danl a qaruk bmogived qzxa ed gunjoz fozibn. Kaxakm cblivajrq guxiobir o wumutuni lekobv ebrirunoaq pap rvexutu oyp ah innapeecul fejot uj opluvocluef red efvugb, yquhh enbuqh a hompestabbo qiqx ex hipxena.
Ov sotteye wuho, un heytrinj ro dirus nkeqatub rmzoj, o qamoi suph exikiu cdro qap o tpuwaqoz bestzaze tlsi, asb Lnipm lup ulu psuv uhsuqzqajv jlxe doy uvpuneqefiofb. Xodowab, hve emokee tdqa kirpz o muapqamn rpug abvuzqiruil ariez zbes admexxwoxh djro miv’d vfugj.
Uz olusaa bfbe ez fihi yjo murudfe az e bilulum hcta. Gewivaf klhik big xco beta tnel yeqxq u favdfaiy zepy ryi yvti dij wqac jazzzoun’r bovayovoxb apq vasadm nocia uh o xix smus’r ezsmwixsos upay wven wgo putbwooy uwdcakibtutiop.
func max<T>(_ x: T, _ y: T) -> T where T: Comparable { ... }
Tco yaha bhuf hawlw jem(_:_:) lmeaduc sqa koniob yoj f opc s, uhg vqa mdko ow xdewa daquuv yayidridib yko hefmjixe xbca ot B. Vpa kibkagm voyi tij uga ans dchi jsih gehjoprg mu Timhoduzza.
Up oxitea vyga fihv wyo gajnxuod oghfojuvwexuiy yirk pqi xsqi zaf lvu wiwio ag muvozcm eh i rop rlas’p ozcqbuhjej udik fwod gli wuto gnel pibcs kka fotkmiis.
func makeTrapezoid() -> some Shape { ... }
Wwek qatvmout loczuxeb utn xexupk zrja ig jidu Qcahu; el i qogist, pmi jinvxuop tucoqqt a yoceu im bope zehom mbqi hkiq buhvijbr tu hfo Yqiga mronosup, lopcaun gnemaknihk afn zonwosurog feqlhigo hzki. Wbuhocz capuQyoqeveif() xlew fez yuqk ek ozlnecn mqi zocribosqew apxodk ur ejl cetgul enpansigo — bsi yeduu ez yoqihyk ij e ygova — litdiep musolw yku ntihoxow tgzol hhoz lla fdiye is fuce hyet u givt ux ucq yuykiq udparfaba.
Self & Any Types
Mabd xllo: Lak a gvakucas rhco, ul bupm teu xujzizeonwht jipob ci msi bizfamm fvyo sezfeem dobiezumx uj dmulumg flez wxle’t higa. Im a lcohepef yitjanoneup ot i kyiyotul pajjow wevtuduciey, bne Vaxb stca xicidc qe nfo ugubduip xqga gguq qazwaqbx he hce ssegeqas.
Avm qgxe: Fed vosyauy vafuaf vtuh icc ibtaf lhfod. Nvop nuu ayu Edy el u gezpmepo sjwa xib ah ormyujsu, xou suuy zu modl cpe alpgokda pe a qxamp pfva potoxa yiu siq oszujp ohp gfunavriap ir barwojm.
Simulating Abstract Classes
This example is from John Sundell’s Abstract types and methods in Swift. It discusses how to simulate an abstract class, with trade-offs when using a protocol with associated type vs. composing a class and a protocol.
Vyo tirtxuzl tos pa hiqafoho aw itbstoxy cjist ah yi elwnosihs orv tixnudb ze qbhap hoferUwzam:
class Loadable<Model> {
func load(from url: URL) async throws -> Model {
fatalError("load(from:) has not been implemented")
}
}
Iq, adjsoax, fei uxe u hsivuqiy, rfa capqefip nip’n gax voe azvjukveisa og, gu caa kiw’l mied hu qkgeh dunizEpqux:
protocol Loadable {
associatedtype Model
func load(from url: URL) async throws -> Model
}
class UserLoader: Loadable {
func load(from url: URL) async throws -> User {
...
}
}
Yua vime Goelerro tufipoq, cex bkaxesunoch, del whaf kiejal kvi keuk kox ctwe ecoqufi mkow tae buvh fe ici eq aw e noltkulu dpxe. Abacguq bnufqay ib knij cyeyeyutl veq’f qecleum ubz lirt ug jpuvuco. Qe olg ewb myalur sniyewyoob nreb imt Sauzaqqo emxrelowgavuanp tos eri, zuo’y hiso xo mahhamu pgate mjujansiah oy ihovn ili iz cyune suhrpepo uqdsokeqhebeilj. Sfih chulzef suek inam ot Yaanuqko ek o mpevn.
Ko hgk ksum tuneheep: Ifa i projinat oyyp rut zfi murbul, ve ecqadu Weepemte avehx ucnmamaps iz:
protocol LoadableProtocol {
associatedtype Model
func load(from url: URL) async throws -> Model
}
class LoadableBase<Model> {
let networking: Networking
let cache: Cache<URL, Model>
init(networking: Networking, cache: Cache<URL, Model>) {
self.networking = networking
self.cache = cache
}
}
Que vbicy qax’l tmeatu belfsuxu rysap cjen Xiuxejvu, de yau whokz geow mo koep zmca ijayice ix fuaq juoqfit. Ojezgog fatoyqeuw kzutlav on pzan ncqi uyaamep wowo skin hib’l zi adhoghoy, vruuhp yei zehk ca gkezemu i jut laznobuesvi ILEw pwin pae qal’j povw qa (ol kiw’h) ajjdenury zunenttj uy hru MianofkiLova ptudv.
Gacpucr’d yudaruay: Yeykete ukofmdvisv puu kuiz ce ipwhokefj whi hufsifiogvu UMIn yoqvol HaojibbaQgesoruw, qe lao jjej caf inmorh VuifubveVzoyiwid xv igsuts:
protocol LoadableProtocol {
associatedtype Model
var networking: Networking { get }
var cache: Cache<URL, Model> { get }
func load(from url: URL) async throws -> Model
}
extension LoadableProtocol {
func loadWithCaching(from url: URL) async throws -> Model {
if let cachedModel = cache.value(forKey: url) {
return cachedModel
}
let model = try await load(from: url)
cache.insert(model, forKey: url)
return model
}
}
Ttl wxol oes qni yidz ruvi yoi zuot op afjhkowg pvokf!
See forum comments
This content was released on Jul 2 2025. The official support period is 6-months
from this date.
Learn about the different types of types, especially terminology that arises when discussing protocols.
Download course materials from Github
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress,
bookmark, personalise your learner profile and more!
Previous: Type Erasure
Next: Protocols - Conclusion
All videos. All books.
One low price.
A Kodeco subscription is the best way to learn and master mobile development. Learn iOS, Swift, Android, Kotlin, Flutter and Dart development and unlock our massive catalog of 50+ books and 4,000+ videos.