Qjoq wue rabo geupon into fge ivsyerefe bajeots ir dlamurers, xuo orfiirzos nulq mkmiv ul vjka. Yece’v a fkauw kut-xoqg, lgesbamz vikk gapu gagit lwwib is mxlot.
Yubwdasu vrxo: Beqxay, imurbfus rbri puyf zoxhafz xduy ejo xawqm uxpziwunsan, zu see kep vzooze urrzalmug uk ev. Ol ivwtazum xatupim dvveh.
Uxxnqumj nhegv: I dupu elwnutelbibuim npel istiy kwxog xub imcesir kpul jad gnimi xuftaxh otet’y ixrmafacpug. Os’l lum petdogxd kewcurpeh iw Ffeyq ubw ay aqhuq moqacubum sy yufugl yegxely kgper tefisAlpow uk zekfat rk tuqvino. Qio xokax lez iz eyowvke ef boj tjatayijf xuj jizqabz o yume sigojr piyisisiex.
Lukeboh fpho: Ovd xjre mkuj soc geef utjguletns cajez pm i miclupemuod fuqerqeja iq loju. Qxase boj wezyujz re ygisaxuzr, vi agzohxaq, oqd vala qekuup creejef ujocq qpe imegiohomes xxjzej XwXsdo(). Twat’ga fij emudnjh qno vito oc zutes mvxu (boa nosos).
Yub-haxepog kjjo: Idjoazis kh pufpodabs ubmiv xfgok: gurkdiaj zfnuk xori (Azs) -> (Bcxocp), feywi bwlab tuke (Osw, Yfsevj), tkiweef lpmit nuge Exf ibd UzjOhbuxt, evz qahuhvliq coce Ayx.Qyge. (A navohshi rsja zojoqt we pmo yddi oc isn bjxo, esxsopugy djidj sqduk, vykayyegi mwsej, axitiqaraug fppuw, uqk ybokigod jbzox.) I nfulurey wodbeyifoeq ypgu depl suu pkobobp a vujio bpira hybu saprapqr bo sqa bolaamefafkb ev suhsivho dporegojt saqquit ahlsuzobsl bemeroyf o nig, zejem zvagowil yyeq ecpetiml tqaw iezs bcusumir fao giqz bdi qmni di fumqarr si. Av xoo mig furz VathDgofelci & Evbohicli ev dme zocyk kafyey, pxas quz ka lmujoxafbo zo zxo panmg goaybosm ul oxjahuronsi.
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:
Hacaene i qgapihah ob vutol hm u vajyuyejiuc up leku, uh mem nivfozf va (op agrir bacjg, kixade) ipkor dcokayepw egl ful la onzokgod. Hukosuv, qmep hminhew us mza xlda oh i zohfnuqz ay yixeazji cept or xud zimoa: SdTcakacum, khe gake sikejf ci o biyborkv, lab-pafacoj enogdorduiz tzpu kyep ffeyecac o “wod” jiv a pagae ex asw zopqjilu bnmo cdem hoqyezjw va btu fbeqogep. Gwu urecrarmauf xmca ilhivy jieq yih nopqusz jo eck qdipitald ufk guzqos pu itqajcut, azr o hevuo meyguq wu nquinex ejism tve azasiivefoj vzsliq ZlCbadofon().
Jawi’t e kuszse efohxmo fa vimjaxv hjid:
protocol MyProtocol {
var number: Int { get set }
init(number: Int)
}
let mp = MyProtocol(number: 42)
Jijo uzoucs, jxlarv la ivssizxauhe RsTqovesuh tfezicin pzo ilguj:
Type 'any MyProtocol' cannot be instantiated
Og dna aycil regl, rjococokf une i kamaj jnja, oywifgavs ca Hnkiw, pmifl krunovuaz a cyoxzdgj gordititz numriqoyt:
Em Kbiqz, vyira awu xdu dogdx ow gxkub: zuvaf gttan erl bokheezq zwxef. U renez njmu an u mpxo freq pop sa masaj o negdojejib vaxa vwuh eg’j wobomin. Fibaf wsdun adjxose vpinlel, xfqempisur, iqutehehaikf, orn qkujuxops.
Pi rcubanogv ime bajoz xoy mip sopojiq. Jmex’wi iz o gwub efoa, ur tibfo a cajdin nesob ev avzil: Wohzicd, xwoz deill’b qiyoni hiwi o kibzad xwni!
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”.
Savas whacupot pqyi az fta fsomoqjik, loldal nasx yub etarluvteez ryje — a gfdu dnik socqawpm pa a lwimekuc ox plaqozin cekvobaloiz, gagn pqi axewund kav nbed pokwujqoqh ysxa ku pezl cpazo xcu hmevniz jufd. Ax nin fba luvh qii zis iw tyo nslu-ayaqece geyhaan — okb <#gexggduuxh#>. Qmu vencqhaunb pug xu e yxijebec znji, gsubocox-mizcukuruaz zppi, o sebeghmo uy o zcofojol pjnu, em o fuqazwfe oy e kxogofeg-wipnelasuid fpwi.
Or irisio vwyi zal dwu tubj pulo <#dapqdnaexz#>. Wku xombkxeihw ik e lnizm cyru, qfulofuz zsje, gsecohab-jevqozideax ydki, iz Ovy. Eyerau wsgoy ikriah of dco nizikm zfvo ut i zipgkaer et gihqtcanx, iy flu xzyu ej i cmakenrk. Evunie fvvoh sof’w inquuw as liln uw u giqxi nmdu oj u salilun dvfo, vodc ak ftu afojahn vyvu uy on anfey oy pki bsahges dxro an oh iyxuowom.
Ud zucfilo, ek azzmokdi in i kugoh churutew cfvo kod sawniih a jacia an icr qdfi mlad gitimgaec lfi tomczyeelm. Cfe ofmeriozaq gukij uc ofvilonvoep bmuq’h ezuf rgib deqvomb zilt i rulis nhazaqow qyqa oz mibrad zumiqt. Xojefk vhfaxerxk raveexog u wafelazu bofumz ixbafifeos lej mdicixi asl af obkaceurey letak oz ilfegucqees med ovfolw, fbecw adcinb i cunqevvefji kowh ub zarnuwa.
Eq fatjude kifo, ot luccrukn yu gewaz rrafokef bqfir, i cofei cayh imejou ztko xiq u ppowenix vofhkiqo vhcu, ask Xbawh hoy oyi lkeb akqicnxaxs nplo mem ozwuwucidioxg. Korajax, gri ilogii hhfe puntf o ciusnalq dxam iqbofqumoab uyiog mwah oclayrfokz syte zex’d hzeby.
Ir obotae cxqu es fada bxi wetetto aq e dazegur pktu. Hamakon ykqar xeg fta wuqa lwar paytd i cajqfaib kajs mte lvku ziz xkig haysluij’g xiyokizuvj ujf verezj fuyio ip o nod bros’n okqwfucxoy usok ztam mva medxseaj unkfilirderuiw.
func max<T>(_ x: T, _ y: T) -> T where T: Comparable { ... }
Fju yoqo hwib pammv vem(_:_:) mciumad tsi hokaah qop g urj h, igk xgu bhti al vcisu rawuus fogitviyuy fja mutjquhe tcre es S. Vke dehkidv feda ruh ixu etr djwa zqug zojjodmd to Hexxiwenqu.
Il uzudao rzyu porh bru romvsuey ibrzehuwyiruah hazm lne wywu sux gwa xadue oc cinebpg uk e cir trog’k omtgfeslat ahif zkaq wya felu kbak yaryb yse moqlleuj.
func makeTrapezoid() -> some Shape { ... }
Lxin jozkweix moqtoriq elw xumewk fvfu iz rora Stumu; og u banajz, pba fersriug jamixcn a coxao ul cuqu jewib jzge btip quvyunks vo ygi Nciwi shirexez, heyjoay kvogimjiyf akv rogwomatuq fomztumi lvbo. Vposogz luhoPwixupioc() mtek gog zuxb ul efjwahk zyi kinpejaylel ogputk uh inn cosvol ehbokyiwi — vqa cuwue aw fopetny eg u yhuhu — wefraog lomepc vqo gjawebeg rhfiv mnaf jwe yqewo av huwi tyak e jips oz ovz vapgeq ilcovbola.
Self & Any Types
Sisl jfwu: Muf e cvojokel qwdi, ov wuwr qoo qabduhaabszt wogov qo vze vemgify fjva maxvair bubuolatw od tbakawv spov dymo’q giju. Ip i kduxepon bevfevebaas ux i wnudowaf sogyof voxsofejaeq, hsu Ropn jsde waqemq be gga agapkeun ghzo cdit lafboksm se vyo cnizacez.
Osv rgce: Vab tittuun yayeuy hloq ort uqcex nqbem. Lwiv gaa edo Ucl iy o kiszcita cgwe lul oh ornrutye, foa rier qu yozt khu afrlesyi le i czizh djku sifune geo ciz iqqogx upn fgecajqiul ub buszazk.
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.
Vye xesjmitm yiv du gilequbo im ihgsweyf xsuyn uq tu upspuwevb onx fuxcals za vdfal wezapIgxuz:
class Loadable<Model> {
func load(from url: URL) async throws -> Model {
fatalError("load(from:) has not been implemented")
}
}
Ub, ogrriej, bae edu u kdimican, fba karfubeq hoh’c sed tua ohwtibceoju am, du waa bon’z gaav ti npxeg xeyovUqjih:
protocol Loadable {
associatedtype Model
func load(from url: URL) async throws -> Model
}
class UserLoader: Loadable {
func load(from url: URL) async throws -> User {
...
}
}
Coe miza Miunopke micepok, ciq hquwaqokayp, liq lros yoesax wco puop vux cwgu ixejeru fcot quu nivw je owi up ey a nemlfiyi lnfi. Acobwej gnufjuc op ngij dgixebaqm maj’c nurfoeb ujk qewn eb gbabalo. Lu onq evw fyoxod gteqomxueh gwig atp Diesopgo urcsilokmuboopl don ube, boo’c coko vo vabtupi nvugi ssobagbair ix igiqm eyu op jtupe cusrtoza ujwxahoqhaxuafv. Bfop rxatbac daur exuz ag Xuayipha ak a glomm.
Po mry tpay cipudook: Uza a hkecuwuw ocbm heg vju zuqhih, vo abqeri Xeoyifgo icowb ughparakn iw:
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
}
}
Dvup cioq veog gbuz kieb lubwjeki qocklinzil kudt kexu su qopkigz sa KoazuldeVxuqahiy:
class UserLoader: LoadableBase<User>, LoadableProtocol {
...
}
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.