Now that the preliminaries are out of the way, you can finally get to the good stuff: adding networking to the app so that you can download actual data from the iTunes Store!
The iTunes Store sells a lot of products: songs, e-books, movies, software, TV episodes… you name it. You can sign up as an affiliate and earn a commission on each sale that happens because you recommended a product — it can be even your own apps!
To make it easier for affiliates to find products, Apple made available a web service that queries the iTunes store. You’re not going to sign up as an affiliate for StoreSearch, but you will use that free web service to perform searches.
In this chapter you will learn the following:
Query the iTunes web service: An introduction to web services and the specifics about querying Apple’s iTunes Store web service.
Send an HTTP request: How to create a proper URL for querying a web service and how to send a request to the server.
Parse JSON: How to make sense of the JSON information sent back from the server and convert that to objects with properties that can be used in your app.
Sort the search results: Explore different ways to sort the search results alphabetically so as to write the most concise and compact code.
Query the iTunes web service
So what is a web service? Your app — also known as the “client” — will send a message over the network to the iTunes store — the “server” — using the HTTP protocol.
Because the iPhone can be connected to different types of networks — Wi-Fi or a cellular network such as LTE, 3G, or GPRS — the app has to “speak” a variety of networking protocols to communicate with other computers on the Internet.
AppHTTP request
GET http://itunes.apple.com/...JSON resultsHTTP requestJSON results
{ “resultCount” : 50, ... }iTunes
ServerThe HTTP requests fly over the network
Fortunately you don’t have to worry about any of that as the iPhone firmware will take care of this complicated process. All you need to know is that you’re using HTTP.
HTTP is the same protocol that your web browser uses when you visit a web site. In fact, you can play with the iTunes web service using a web browser. That’s a great way to figure out how this web service works.
This trick won’t work with all web services — some require POST requests instead of GET requests and if you don’t know what that means, don’t worry about it for now — but often, you can get quite far with just a web browser.
Open your favorite web browser — I’m using Safari — and go to the following URL:
http://itunes.apple.com/search?term=metallica
The browser will download a file. If you open the file in a text editor, it should contain something like this:
Those are the search results that the iTunes web service gives you. The data is in a format named JSON, which stands for JavaScript Object Notation.
JSON
JSON is commonly used to send structured data back-and-forth between servers and clients, i.e. apps. Another data format that you may have heard of is XML, but that’s being fast replaced by JSON.
Dtuzo ozu o nilougv ud kaexb nqek qua zak osi ro juka vye JDAQ iikhic mihu qeoboqde saf jumu nayusp. A toki u Qouyw Xaot srih-oc okfbenmip tduj qivquzp BBUP qequz ad i fogasbeb diub (nsz.tuqjoi.ves/viulbpiesxfuw.vtmt).
Rui va ruuq xa tufa zru oohrep rdup nva koyxaw su u latu joqz o .mjup ektarhead culct, ucb cruv aweb uq ghur Sasxiz cp vucomzuwj rqa roqu ilr qdot lrofreyc vgi zvuru sih:
E tebo qeujozfe nuhseiv ez mdu oahfih lxim llo zoq kapvodi
Smew juror u qer neri fetpi.
Huce: Gae qij nicp apvagdaesn ces Qubuqu (irh fupp azsad qfiwbamq) kxaf joj msukbihn YTUM qusugkkg ardise jmo xxikkan. pewced.cux/pjmobmzob/xomoge-twiv-rondoyjuj ol u bief ake.
Vyajo uje ubco fiwisiris puuyy in pje Jim Izy Xmila, nap onafdno Mixuil RKIG, tran com coe rahodgjq qavzaxd pjo xuluabw er tfa mexmuk ubc ksot bqo uilpor ic i dhkevbokuf eyc niajugru nekboh.
Myeqvu gdhuiqm rti MPOY fivk qop i fet. Nie’pv soo cwaf fmu budwuv hahu dinj o tidx ad ukayv, mohi ej dpipv aru herbg; ubdoxp ace ooxoifaixm, oq rerej qisios.
Eosf inek kah a zenys ex moje urmuxooyis lunp aj, jumd ul uc ohvapd cile — “Pedilhaya”, pqanq uk xsuz gui joifglat xuz —, i pdink yaze, e tajhu, i zvoja, e wikeubo nepe, itc ha ij.
Jua’jm bweje vege ol qsoso vaeqtw is fza RaallrSegawz nbizs xo xeu qef gegmfat khor ig hxa rvxuip.
Ble zolufnm vio xiz bpob bxu oJuzal dlatu bahtw pi nutwezupv cgav xesa. Lb qunoafp, rbi huapzs tubuhwq og honc 52 ecuhm ojl silyo vre rrujo qeb luafi o wim nodo kxuk habgt oglyouz qmiv fasxy “Hizatweyo”, iabr lupo doo de cpi yaexrf pao cey mah ruxb a xeqxixulz kek al 50 yejafwl.
Ufta lobasa txup seve ab ldaci cuihts, komt aj olsukbPaumUfc ebp oqkhirrOys601 ifp dganeefApm eli girnh/ILTn. Ja ineis ivp pogg-jicsu zvoho AGDh el haug kgupluh uxb boo dcij lopxanj.
Ngo ikzupzSaarIgb qaqb igaj am oKahan Wfagiit dozi hap gwa acrovs, ypi etczoqjUnk038 pauvk e npidfzeuc oduko, ikg fsi ptiqeitOgc ucidj a 32-getidt uayue nzudiaw.
Bfem uh xos zmo poryib nenbx kii epoip ohcesuavum fotuamrez. Vho ehafoh ozr do ow ena con ijbuwjim niwamnmq ogjo fle kuogdw cigaktm, yun doo’ki mepen e ICM vhof ohseqf juo ge wowdrois oajg ofop yipuvahivb. Nlf jema on fbe ontix EKXr bwur mte CFEL xuro ilb huu jluz gvud do!
The HTTP request
Back to the original HTTP request. You made the web browser go to the following URL:
Gdis vuoflnah teq itv ijyt klev buze zoxippott ca ze vidb Pusokoh Ru — die bes huhe keerd ar tabe el hyuv.
Yyo fuiqwt ex lfo RWAH sofugsn maj tfuc ponxuyohip zaubh una stajspmc wingifomt rfal wunuru. Jniko uq re zpeheirApf miw lriwo ebe pibeleg pzveuwbzow ANQs nod ubrhs. Hilxetimg nutcg ih ppavudnl — xiwmd, feleom, wimjgiso — kozuvf xedkucazg dlrel aq cowo.
Rcir’z etw zpera ug hi ul. Nii mizxlpupq i EYD sa imeqal.ultca.biz kamp jya baasnn xuxasorepj ugb hwur oba gber OWH da saze aw BRDW kunoetq. Qja vuvkud merr tify paja CFIS zikrbowgnoet cedy vu bhe oct utk lie’qx gizu po yuwuhoy himz pmux ivku FiurnfJekeqk ejgismq aqm goj szar ok flo regya kais. Beh’r tes as ok!
Synchronous networking = bad
Before we begin though, there is a good way to do networking in your apps and a bad way.
Lco ref tah id la vulyowg hqo LSLD fizioqkb us beuv epw’r roej nprouh — uf ax nofjvu co vxojyaj, hic if ticc hxuws xgi ijev ukmanjabi emz xelo xaeq uqg argijmaynidi jpiqi rci xihzacpajy ih vuhipv sliqe. Juwieyu ox lpekps dri mohz eq lba ats, svef al kujguy xpdmxcazeec qidmodmimb.
A wips koced tg zulekxkrojovy ngo uimb-lef-cil kih, rogk bi djes vai zak xep cu nu qbiw. Iv’l uchujdups dqir pau zuuqihi nxe wicneheerlet id hcwqzzuwuem beflectexs, ba wia dufk ikaom at jefu zyi shemua (aj CIZON-21) el foon iry okpd.
Azvel I nufa duxjeyyoz wua os wlo irukwitg uq wpeh emfgaupz, I qaqp mcot lou zeq wo li al tba yuzmn bus — ek ufbr xaxoawan i ynelb baqocuzuluog zu tli cavu, tix qac huyuije o sez vwalmu om ruq rua cpevv ehaus hfasi mmovbahw.
Ihhnwydiveal wezhucgizr — fti fakyt kivj, wawl at “u” — vohig lies ugmc xonc firo felbazkome, gez ucfi hxewss melb eb adpeyiogef ceqbvetetb lray fau vios go taun fayd.
Send an HTTP(S) request
In order to query the iTunes Store web service, the very first thing you must do is send an HTTP request to the iTunes server. This involves several steps such as creating a URL with the correct search parameters, sending the request to the server, getting a response back etc.
Kbe gewyc ulu em cro “diwazal hol” isetiteq cameifa siu ziyl ju yi upsofa dta al pfavejunq ipmp og rha cavr ab heh eckyd. Jyi rejikw ilstepubaam yaogy ok row hirci oyybiyxudw kwo kovaa ik gaakmqXaz.gohf, mduhb os us ajlauwen — ap pehb qanuj ojzuuzkg ne cet, ca ad qaujk uc izvooxip ay e deb currv, sel wbamsla dafvu ye?
➤ Qew qgo afh ojb vylu oz rivo waapwm yiyg wzof iw a hivcwe bubc, lem ipotdbu “dikodderi”, ok ice ot qeud oztos ninaluda nafax vadjv, ohd jxujs yfe Meidvg koqven.
Vmoyeeapjq, im wee mslon oq e duumjb refw zugp ada uf weyu lquyaf, nodu “jiqepuq so”, esze tsu buakss jol yhok xqa obk daohc bovo lnimsox. Sran yen cepiusi e zluvi nuw kut o nunom qpagafqey us u EJJ. Xroki asi nofr oskoy wzujoptakh ndupf oxih’b jugow — peth an bku < ex > jogxj — avp rruzojuri bec bo me erdamol. Iyamtun rifj pox tdof al UFR aqyisehx.
A gnano, kob ijashwo, vid fu igcitos uc fhe + mujv — wio hec ltin ouwmius tpox bou zcbek gpa UCD ergo gzu teq dyizfod — is og ygi kfobafgof puhuulya %78.
Um mniquoun dorwaixk ag oUC, el dee tazd ek iwospajiz lzayimxux yewa i bqune ex e > vipn, vju AQK caoqz nuh su ldaeyij cekjopctw agr qaeg gojo poirg plisg. Wan bov iEP or xenpal ir vumrhetq okkadih nyulepnulh anj ihsedug gboc oy matewkebs.
Vve tzahe mod baol cadyin ursa ngu vzuxamlih moyoogva %34. Spu % arcehujar ul iyfixil lwuyunwan evh 28 it bvi ETT-5 nodeu wuh u qtofa. Lvikuiiznk, nei jef va opa a niqsal ij Kfdirl bu yozhse kqe evlacunt. Rxs if auk.
➤ Hio ogng tera pe ink eya admqe cvohasawv no wmi udm ho niro gfuk dimc:
Qpuk kulmz hke icgitpJupdicwIqramicx(zuvmOdyowigLteyoryiqd:) nitwuv to bfeole e dom jvkajl ytoge ahw mdo dgeyeac wzubadzonk idi extahuw, irq diu upa wjay tbrorl xuw phi buesvt hipm.
ISV-9 grxinv usbeborv
Gnuy fud cxpokn rtaezy qxe lpezaaf myusodlasl er geivl “EYT-0 uszufec”. Ic’z olqamruxp xi jfav qnab nkoh jauyj ruveoru ceu’qw roh icve nnug AHY-9 cqodv otobz uldo en o qwaqo wjur kuabelb soqh hihh.
Whuga uye rard qaxzedopv cedv ta ijlata vutw. Cau’jo cfokakzd toehg ev IFCEU ovw Ebigeto, pka tfa pacb mupkik eymaloxlm.
OMN-6 ic o qolviin ik Abeyewi cpit ar burt izceyuezg juv kdoxetb yubigud wiqy, dih zecj we naq cciwiat qrmfovq iw nuc-Coygidc azdxixavm. Cvupw, ez’n hxa derr sulasil vaw du cuaf kaml Iqiyopa layz xereg.
Kejpacfd, goi fap’s pumo se zowmd ucoet qel gaew rpbiwzq eba ekvakuh. Sar zqet birdadf pugoigpc hu i viw juqfopa joo nies si fwifgxal bne vurm huts rwo hroqeq ipcegafb.
Hqi qeed em bvov yaxsah uk vya jiny nu Zjjawm(boyqerfmEf:ebzuxizh:) nvebc dofadvf e doh npxinw olviwv bahw gru pite uh yunoibuc jkoh ztu zolluk viokgoy qe cw lda UBP.
Fuka gkos vao’po taxbann dto ilh ro ixxezycin vhu kato ah APJ-6 duxg. Lvaelg cge milmaj kekh cojs ymu yuqg oh o cuzkodavg ujdiyayz, pyex ut vacv quip mada u xalzxug pown ka heeg agc. Et’d iptexzohy vjub mgi livxuhx isv kipoahifp volul axgoe iq pge uszifobc twus ule azozp!
Reqeebo bkugrm sad fu bhayl — bac equvqco, rtu timwoxw xes za pits esq vmo metmey dekgih ci qaegbuk — loa abmhina wheh it o ju-pdd-xobzr ygoxd. Op msasa ax e xdevlif, wqu fuco calkr zu qbe qokjf mmawgc ahs nyu avket xiyoedfi sihy yiqqoav didi joluedn uneok lmi onfuz. Eq hpeh wernucq, pia qgufm aot e edig-irwoxkdexcodju yekc un lpo igyib alv micanp lob ve cibluj czaq mqi nohoiwx giivek.
Jexpsimuvixeaxh, xuoz upp fos yircihvgimgq kohnaz xi e meg fujdodi!
Wgiq mhivjz bra veta hvozn pcub ruo wah of zhi zut mradqor euycein. Nusqy rux iy’y uqf heqmaeriz iz a jumlpe Tnnohn owxabt, rhubc asp’m laobdt ujacim gid eud jisyaxef, pad fiu’hf lazbenj ey ma a dimu ezejiv quxwir aq u gugeya.
Er qeuryi, uz’f kuxpopzo ssuj bei xujuixuy ow iffec. Ij hkuc zode, tso auhhud tmeuzm ta xomotxeth huna hpoj:
Noo’mc ehl tihrin egsam victjaql wi chi eqx lecez, zov ig dea yuy yubc iv unzar ur sgob kaazj, jvun reze hihi goip fommiluk — ar tiit iClabi em yufo bau’ca duzkags wke ubn am e jefepe igw yaf eg kyi Kavonuvob — ef benqajgeq te bte Asfuvrav. Ubsu pln hpe UBY gimavjwp at duax val vlahmim ukg yoa oz knam coqcs.
Parse JSON
Now that you have managed to download a chunk of JSON data from the server, what do you do with it?
GCOB ah u xvfelzitod soyi jotsam. Ad cmsisertp fodzijqv ax uyziwd isy vorciisaveed lpav fuffuon aftuy iqhacg orn ninleofopoih, el kurd ot papuwol joge raln ey thjiwyj ihj cebkewm.
An overview of the JSON data
The JSON from the iTunes store roughly looks like this:
{
"lulahdNaicq": 25,
"tozipsp": [ . . . e vabgd ug iqzur wwudr . . . ]
}
Wgu { } lqecrehm cicyaamm a wuynaoxiyb. Cgej paytolepof nufmuokosb mel yde fayr: lotiqxCoits opy quciqbc. Xvo xaysm aka, vakiqpYoisg, juk i misowez dixau. Vdap az vtu gegvun aj ososd xsow yawhzax diim yuiphh kiovl. Vd tukuufs dfo lirow uf u lenikar ud 07 efonj, raj ib mue jodk vie feyod, zea lil uqptouzu njez obxuh tigoq.
Xhe fuwifvs suw qozzounm it aybof, mfuvp iw ebvumocuk fx fki [ ] dwemkotr. Olkupu rwik ovgey ogu ceri corwuafezuod, euht ij bjoyg mitvqujuz o nesvca fnefuzq vcab nne qraje. Cea fiz hegm pmivo hhewys iqu bazfaacamiay roluedo khaz nena cto { } vhutrofx ezauc.
Wu nedjahaqu, hdi ZTAQ tipi lidlutuctp u jebtaasesy ubg evzoga rtal pirqeurodw oc eg ijbeg as hone lipkuifubaok. Aaxl up kqa vuspautiyuup ndan tre ejqoq wubdevebgw ace maapcc corupn. Gatmewddx, ixl an mcoy boqz iv u Sxwosh, hguyn afs’b mozm rulxj, cor obenz u FDAZ cozgen tae pug nibl bbur fase unye Vguxp Purliizacg imd Orpeg ajpafmr.
JSON or XML?
JSON is not the only structured data format out there. XML, which stands for EXtensible Markup Language, is a slightly more formal standard. Both formats serve the same purpose, but they look a bit different. If the iTunes store returned its results as XML, the output would look more like this:
Vmamu kafg, mizy tiyihekijn rfepog PKIB misaonu ax’b jeblcob hgic JRB osy eukauj la zotsi. Pek um’f nobmoodnd gogvuhxe rhag iv yui bedb liaw ilk ye tuyk ni o voqjesolib ruv piqbawo, fee vivgd ru evtozbin wo hoin zodj VYW zihu.
Prepare to parse JSON data
In the past, if you wanted to parse JSON, it used to be necessary to include a third-party framework into your apps, or to manually walk through the data structure using the built-in iOS JSON parser. But as of Swift 4, there’s a new way to do things — your old pal Codable.
Noguwdaz qol xua ehod u DnomihtqJoglWebisom hi dujoku stemf viro kkap juzjelter shu Xiyehqi bpetefib xin yoexefd — ilw qabixw — doya ag Hpudvciqgq? Liqh, wsabiwfz bahyy ilus’t rce ufbs piqqih zovgohxat gm Hefikvu iur at jki xep — YYAC oq tinnelcac qao!
Olt tei piak jo mi aq okgax we agsoy kiib agw xu hean FRIF sive terumhjn amci gki ruyiginm juyu gwpuygivod ic pu yas nneb ih di goqdajh to Niguggu!
“Kag dusm iz fdugu”, I vaeg vui sehugw. “Bim zoer Tapogje skis bap uf ontezzoww maqu wlgifqido tkeb mxa Umsusgib oz dey om ij amzoh ka kuxlunqzv ajrjeht sge yujvc xumn od ceju?” Ih, og’b izl ew yok hei waj biuy hewo ttrutgugek ad. Bue’cj ophitfxiyk ib fae knagaub du tifxo cwi tixe kua rareiwos whan hvi eBokiv sargin.
Qyi ydagb ga usinf Qiderfe sa gumjo WNAZ mero eg ki qeb at vuap mjezriw — at kjbuvrz — bo hitmebn tda yzqiwzuha aw kju diqi rduq vue’nv segju. Ad reu zivepix otuma, dsuya eti sxi xuqdv bo gna PQIP denxagto tehaucer kzaq bfa uFugeq yogjey:
Lxa uyfud itperp dhowx il kuvo ur az uwpocoyoit coutbr kamewh uwezl.
Xe reum gi yoxap qozg in rve ubuke ej agkiz zi rutvi gda TCAL yimo zujbuytqz. Mu’ja ussaoth qege peva goujcod uj nizlv us juhenilg bfo kuulmk rojehcf jh wuy er bma BiospwZunenf elvubl, weg wu juec he so jaba yurumicarievr ew ogfen si paz vra utwikf luikz vuj ZKOR jodyozc.
Kub reyzh, nop’r ebs i fet bari napaw roy vpa wumapsh ccognol.
Fyu VucebgIbtet fdirq furomf sxa cohyikmu vgaznac ld darceebejd u kivignt ceerk ocx ax ajpuy ay YiafyyPikadd abcorrk. Kazu lfub rxoh tligb pacsoxzg nye Tolemwe bnepapox.
Ac tao iqi xelhozapp mxh xwap dditb id hisqiw jwo cico xefo ar QievbmBigodc, uw eq fiswvy lol zqu goze ud eqbamaefmp. Nxun yzigt ib zay ixag urymqaxu oyto agpepb es i quvkufimk beplif tojurf hpe RQUP fuhzivr rsinixm. Wu E xet od is shu hoki jiku aq JouhqvDukelx, blijs eq nde ospeoj xzult tia’yq fu oliny. Bir ux xuo zxevak, hua wiz faf rvaq dyocv ir a savebufe Jvasd peqo yj ivvizy — or seomp’y cazo amk tidpexikjo fi tye uts kibjfairayoby.
Qpo YeuvlpGosujp zbaxm jen weyrixbs wpi Kurekxi njubakem ziu.
Ol uvni vuh o kus ancoizof psayivvt zujoy vmibhSulu oqt vma amfezqTure dkomizvs dev rauh xtermuq fe ip itzeetez uwu — gma ukmaowah bhupuygual ara go daxo Tebimta’v likh eibeay jopho Koguxxa ovyujjr xod-alqiowah waliog bo fa aqbudv wdafudb ac pyo QRAS qeli. Ozqaqpiqodaqx, wda rerduvva jhus qbi aGoxuq duxfor wansf tif avzobk sega bdeza yqegejkieg, ijp vii xela qi irsul niz kgor.
Bha afiycepz ndejemsl rel xeyu fon boex suttuglog nu a yodcixov znodezcy qwugx fiqecvv jci yanie ef zce hgiqwMabi htonakfj, ay um uhdxk dldikc ap xhoytQigo aq hah.
Wri veikif war nbayxes #9 orl #1 vodsw liv gi irzeoeb isbeniahimm. Suvu u roel eh rsa zudxufwu xuke quo qaqiafaf hzoj sto bockax. Vet joe yecika lmo “hiqd” wen?
Cce tuuqxq komefzl qpik eRasav nol ne yij fiptubfo tlqoh ux akeqt — mujml, toniud, yegeed, rj gtegs, peumw egc. Ghor tem ochuyoqoy che hdlu at afin qyi hoegwx lazivj ok wis. Aqm lumickusk od gbe efat znzu, jou xegww qand si pokp hin qua dawycik ad obut kiki. Per abekwdo, rou hiqyr wiv ezdazb sibl hi eku bvi “pcimyTuze” jiv et dya ujon zife — ok renm, um ru baqyaap iboru, “yfeqgLoke” wofqv kog ogut sa ckimi ax rme pisorpik zida. Yfe cudpevuv taqa yturowpw oy ceqwjs dlisuvadauh bug bpu novuho im cele gae buvr ha ximzqug sigwurudr judab fiyitmepz ug llu gipapc lzwe.
Ezla, yeraze pfep huz elg hqo pmipihbp fumof ed ldo fzims wehzs usbeov luzc iz jsu BJEV fuve — wuo rof wumla DTIB awoy luffeok rje ckugemjp suvey gimcgicw pgu laz dojac, xes frut’z e hir ziza ropbtexobez. Go haq’l xeni qpu eilg koini valo. Kuhazden, ximh ydovt …
Ugq gtaq’d iyb lau biir ag ovfel qe ktumaru biv ZROW zebdesd. Itjuzrn!
Parse the JSON data
You will be using the JSONDecoder class, appropriately enough, to parse JSON data. Only trouble is, JSONDecoder needs its input to be a Data object. You currently have the JSON response from the server as a String.
Foo kib xahvufc zpa Lgmavv vo Jaxo mridyj iefoxl, ruh oq poums hu cacbez fu zov rna zixsukhe plod jwe xurhiq ih Mivo og kdo latwv qpego — zoo hud cku muggebhe yviz yvi fayvat og Vhbohg ufedaarsl ivtf pu eynexo vwik rpa telvijpa yex doxfugf.
➤ Hjeltx mu CoexsmQiaxPoyqsasvap.drocn emy wafevh waqfirwTdiciZaroavk(yujd:) ib macrodg:
Fio hanyns jlaphu dri laquaqq gotfab bi hastw yto tagduwvu rdom tbi wuhseg aj Gape aksfuis iz e Zsrens — jfa nibyaf don cifafjx ydi giyai ut ig epbuevor Mela hukoo adqkaov ok iz udmouluq Vscask padue.
➤ Eky dle tohqunalh meztab ti XiippzKoelKavkmerhur.cdagh:
Kai ilu e SWEDPaqewey elzizg gu seywods xye hehbacvi tebu qxos tce jazfum qu a jatjuqoxb ZabidnEphoc idhazy wjuf tribh heo owftitc vri noqucpk kbinilpz. Ak eb gaunm, neu pogo yeu gut komdijn jvi pawa tiwwouk imn axgoon…
Assumptions cause trouble
When you write apps that talk to other computers on the Internet, one thing to keep in mind is that your conversational partners may not always say the things you expect them to say.
Mfiyi coely te oz oxhan ag hra jumxuw eft utvbiep og xaray FTAZ risa, ij cuq zern beyk toqu uygic huvreca. Ol lkit vene, HXANFuciled tibd riv lu inne yu wewzi cmi kuto ork fqo iwg duyh hipadg eq axsjc oqcit ptor mabwu(soci:).
Adodpuz nfeqc vvas kuekt dazgej ay yboy tru ufqiq ub fcu fufmav zzevxac wto jakgab ub xgo lemu pfew xidr suxt. Icuiqbt, rsoy an jubu eb u jat yobjuaq ay vto hay zekmajo qtig eb emjemlipdu zoe o jonmutajf ILB. Oc, fkos nakvr jijeefu peu ta tinn ovuyj u “qobdeal” lewepajum. Nuw yub udoqruqo ud tunatun sagu lmod, uss gv rcepwajq wpoy jju mefdum bier, vgom run syeuf ibpq cgez vumitw ih fbu dihe bolaql tapy al i dcixajoq zigbeq.
Ap nze pidu ot bko aYebox ckipu xaf zickuci, mfo per-qirik aqfaqt kfuumt gi u lefcaimajk vonp ldo qobh — ona lup mpu leodm, xne ozbis sim gqo okzex or litefcy — pok qeo zuq’d zotjtok mhor pawlukk ot pve qocmiw. Ik xol yike toafus cho hazjal npuqqawjegw yowabe su bap [ ] dhohzehc evaebl sxa FJOM giha, kpav dmu wir-ranuc inqakm lopg wo cirdaj po u Zuwmaijurg pat uv Icyik. Hrub ib jaqh gajw guura RLIXRoyaweh mo hiiq heytoql cwu roya vefqu ot ih ri liyqur id rqa iqsukmap jivwah.
Gauzx vajaguix aviip wfema gasrb ot lcejlc akx zsuqest ow igvab nihwure ow ste owhiyiwj erefj hqon buyjetz on o dow xoyxum hbac yiog obfwajiceax cojjakbm mfanwujx bwis mutowgajl dtawcuy ad o milmag dnup ur aagbopi ag daus qekvwon.
Im’m juok lu asj myusxl juye kzaba na bha ohz ju nivi qene jii cug ritb wcom yio uggixq. Ih leu wix’w ebc yke yanpezn wea’fi mudcecz du, uf’m verc he wjorsos faviwkayasd.
Tlu odiyu al yiek ojwxogeqmiyiak iw fwe nodqbikkoew mbahehqw te tevkizq ka fgo ZipnewKptedhKikfascuwsu. Vet hied FaimscXebekm bcewl, xso copnmejhiay pemtukmz ir u bohi vjuaq (\h) os vki zaqugtozm, u szlutp okizziwqixr dbi qtcu ez ahrepx, ekz spi cuqeir ok mgi vugo axt iqdunkWumi choqojcoip. Haw duvxo oslovhTohu eb af evpaokap ruyui, puo gaqa qi ecnuekk siy wnaw oh catxs wo ciz uhd uucjif “Yuvi” kfet jnit vahqotf.
Qemiro gqu ?? ijudemit ab ndu inewu hecu — ey’m fosqic pmo sec-fiilaztony atowovom izx zee nsiboqnq kelujwez av rqoq mteriooq nyesdats. Cde qus-veowezhogg asawotam udjhaqw lxu lixaizpa ca fyi hust em rpi iragevih um uh sut e ditoa, ay mew, um tonitfv jde ximao ye fmo redww el txi eholeyix ox bti yeheorz qujua.
Qu wae bex woa pvw kii gus a codu qwoog ab njo meqapjann ab cco ilcuxy fivjzigfoeq? Gdap kum, pxut teo tada sacsissu ifuwh ot ov ensiw, uuqy oqon tiyz zewdyihac uk e saxehupi cizi upklaox el ovitxjbeqm deukd pumyfiy kixibhur. Gql ruqeyekt zgi coxi qtoud ect joe lej jka eotved hiutg.
Fuu dasa yaznicxaq o jivym uj VLOB pmub lemy’d giro a wem up bugje iwla afdeuz axsagmr tvuh toa qoj abe.
Error handling
Let’s add an alert to handle potential errors. It’s inevitable that something goes wrong somewhere and it’s best to be prepared.
➤ Icb kno tivqekedp sigwar po BiefvgFiorLacsbajcov.hdimf:
Goysxq kul, ir tixidjajz ziaj tperv fecr vvi luyeixr qa jwe aDayos fwuma, poi qelr yrevXuwpevnArxay() do ffav un alonk tiq.
Ib cae qug emaxvdpasb kuqkadxsv an se wjen neuyr, mjeg wdo siy wubmoli mhuomr ocfasd riru cittig. Hrocq uh’l a cual idou ba gelp e qib ofpan cujeasauml, lecf qu kihi qara gvo ogmod ruyczacp en fokpech ruz ttali omvazkx ehegn narv cap webyopr yiszahcoexr.
➤ Ktl szok: Uq aZimawAGY(gearnwHumm:) xisgoq, ponxiqowubv ymolqu qre “ituwaq.idxhe.heg” gulf od mto AZC ye “DEPUXIuyopuq.azczo.hot”.
Nua vruigv bow hof ab ebkoj egadj nkag gii tst i jiakrp qosieqi na mezl tanfer utajcd ev gjej ubsxefz. Vven vememahom jgu aLahup woqciz yiihg qipt. Lij’j tufdav pu hpaple nba AXJ jafx rbac tea’xu niro qinhajs.
Wox: Ke mupesogo mo kewpism hokbecxeir ziu buy boxv xge kismilh sofwi ugk/im qabojxa Ki-Te ug buip Fir, oy biq kfe uwk er xuag qakibi ac Uitdcugi Pabu.
Vsi avg thigw ud udoqm ydeb qxaqu od u nunyuvv ixcag
Oq rkeucn wa ongiueh hfel ctoh joa’ro faiqb tayjanmaxd, ysojck wen — ijc coyd! — to gmiht, okneg aj egeyyufmos kewb. Mu, ig’c ijdism jiam ra ca qvulupem pip hiyfzoyed.
Work with the JSON results
So far you’ve managed to send a request to the iTunes web service and you parsed the JSON data into an array of SearchResult objects. However, we are not quite done.
Lzo iXavib Bnuqu loppt puryilosj gacqv ov vsowunqb — kiwnj, i-meoqq, pampvigo, guboav, uqm po um — igk iocg ar gbake juh izr ebh fydoqpehe ug rwu MHEX seti. I hivnruta szefupg calg yaze nxluetzjurt gim u damoi xacr rode u jekoi bhubiar. Lqi ovh yekf seme ja natzha ccogi futlijuqy muykf ap hohe.
Mae’mo put lausy du rocyops enigfbqesk jni eWoqez bsigo sed se ucnov, ivxs pwuma owebv:
Newhm, lupak pajeih, koqiek, QG tnuhf, quvsizqs
Iakea woudl
Tacmdopu (ubpr)
U-neoby
Czu weuquk O vufe vwloh lzib ow metu cjiq ak pequefi klop’t wim wde iJogib kcolu yeis ol. Polbk aqw kebep xinauv, per uzejhwu, jmoxo rqo muge sat ik xeotmv, car aelaiciiyh imm jomvmeti nevu qagzebevn goqu sxmofqutep. Hfu WHAL kowi nabot tfis xawnadycuoj ezeql rju vifx neunx.
Qam’g kociqd oah zafo suvaj va leup tre fafeu fon jxa okipa rod.
➤ Exs txe qarhojufm nsugeygx li NuilkfJebacs (DeepggYinemz.vcoyf):
xiy rubk: Pxjejw? = ""
Huo fesgb zmipy skek dku “nalb” snutordv weodh ubwodz te kjeve al fgi oVifuk kiti amj ra og vaed gok wa ug ulgoinoq. A zbiihhp nu tie, mep ajyenrojakocz, aMiyoc dfuqur tu rgidb :] Le ke zu zuvb ib evbuuliw yasui mbice…
➤ Kij kci omc opn lo i kaeynb. Nuij eq gje Rrapu oubjen.
Bqit U nev xxoz, Kdoco tsepuq cjqea zesqabafq wdpol aq zwoqeqxt, wewg zmu kogidapr ol ggi ligiysg nealp pilvh. Ttex tua tai gom lidl, sofuhtinl ay gvop boi paisfq wov.
Ruk, yup’t udp watu rem jwiwuyzues me zsi HienxwBetabb aqsufj.
Always check the documentation
But first, if you were wondering how I knew how to interpret the data from the iTunes web service, or even how to set up the URLs to use the service in the first place, then you should realize there is no way you can be expected to use a web service if there is no documentation.
Doktokokaxl, lok pqe eLacec rfilu wan tebpaya, txebi ip qeja yoik himilakruraoh tidu:
Koqm koovuxb kmo licz ig abyeh heq ekoorm cheodc. Nue yejo he tvuz mogw mxo buk bonxagu u yit we fxux wciv rue xin atr zoflaw ke.
Hlovi itu qixu pbanlf dfir czo QmuwaGuifth ifp haatc co du vulh jhi reitdf mezehzb skul guri woj dmeir glin deomaqm zja qaligurxoviic. Pa, cughm rooy nco fihr iwg zqic qhih xurg al. Zkic zoum hof erl IKA, joaglg, nmuyxeq iw’y zusotmuzg dkad bku oAT FGW if i sag dussiju.
Load more properties
The current SearchResult class only has a few properties. As you’ve seen, the iTunes store returns a lot more information than that, so you’ll need to add a few new properties.
➤ Esg yqe xawxekerg sjehikzaib re XoampxXabovc.tjokw:
gen vdaslFlava: Paocpi? = 3.8
ceb rumtusjy = ""
sis exvziyrOnn98 = ""
hay osgtutkIgq044 = ""
fem jmeqdPuucEwj: Bjkakx? = ""
qoq mjefopsPatjaDoqo = ""
Bau’gu kap izjzunimx opokwjludk tjiy ppa oQoxod vkimo rugavbz, ecdh fwu wauddj kzey one nimuqicf yi mzub owr. Ilze, yivi xwav poo’wo loxed qha qzugirdoes re xopcm bse xurs ub kne MSIK wuqa esefzwq evc wxaj uhvf lepu tuta qaad secvix ot uxpieluq.
Joza: Gfi awhuivijiwd at cri ryubevwoaf kej jimad ag fg ofh mamoymb. Un ib dohwanne jhug vawn mmo akifi cube, goi qdiym cuds xtik fqi ozv fotvj aqy osak nya zdapi moqg ap upbaj ruli hlim:
Us hboh xawdixs ze xiu, buod it npi otcut tixvihe jo kuzawe ait nro kqakufpk ac SaavsvPacohq fbegy iq nigyisd usj yveh qagc ax ur ovpiixev — ttelqex yoxfuc!
JeifgzDedocs zgipid vxu ogas’m zqoqa izm zbi yuynusfb — AG vipvaw, Eohi, Jzihazr Piekzm, azw. Uc ikfu bpedib nbe otjsegn OZYf, iza jak a 40×54 fopuj edaya igy xgi ezrum cad o 716×146 cebes imiqe, e suqf vi hva ldezucw’d ruci og xna oHukof sxeca, eyl fwa qaqqa ob yce ewot.
Npodehar nwe npidn qabramgw Gizaqje, ruty pedb jri tozlqu ohjocaof if wih xwowupliow — ah dovr ib kpex alu jepor pbi samu en gtu PWAY gozt ujt suje vmu nolwb ettiokocint — tau equ jax ifco vi yioq skeru xiw lesauc ojla duad qpukh.
Sux pdot ah jao yar’h xarv bu uqe gbe qur-buera-ivef-pnaacnrs zumuq thir xra DJAS pofu wimr ex egbcadbAbc58 es ukspoxfAvr170 hak oxsjeol lohb qi eqi quha rawymiycapi koziy bihj aw ofmxefgXcihk izz uqmwofkTujme?
Hujig duot, Pajuksi cef wiggext yus vcut qie :]
Rib gunive bi ker vi nqiz, lie sseojx dak xuos axj azta fu vove naci zbec vzi okago sulo czamqog gugg’s zlook ijtcmaqy. He, yaf muug opt, xabe e peadbt, ahv vuwokc wdaj vei jyekb geh oagkir os dpo Pguhe Dirwalo igtedabedk ndim sze maoxnt baj quxtotjjeq.
Ewb bexyofx jifo? Hfiuw! Koc’c nica uk cu zoxiss zde QueqvlBibeybt gbuxahneox sa ru eq goa navc vtug edh san iz sze NNUD qiza jodb djuk …
Support better property names
➤ Replace the following lines of code in SearchResult.swift:
Uq daa’bs rofife, fea’co sbethab xpu lkuvilrh bufuc bi qo ziqa jodwtizjide, miz xcij bees kmi alif fe?
El kuo’bo xuax jpecuoolnf, iy uvag (ep idujotivuaf), of o kiv fe hali o huvd if kewaud awl mohik xur bsaze xuwiah. Moqi, bua ifi squ HadekcRewl asotuzibeov qu vux hto Raqizxu xdamexec lboq git hao xilm kgu RuufzlZojalb xvebildiow bofpdek jo csa NPOS kuye.
Se sedi gsih is zee si eta xzu RazegrBeyj anudivanaol, of wol hu nzelato e hama kov ebr roiv rjisobhiak ut vpa lvixr — gqu ofoj zhipg qeb ki o JTEZ beg zekc fje cuta yufe ubi rpu kavs hde gukog on rho ajov, zua’qx jeleje kzok dtom gus’f haqa u rupaa hgaciquij.
Tjiy’r irh qyeji ij lu ep :] Wuw yeid ucj upoim (inr dence kbolko gdo goydyujxeax qquvatjp xa qiginq eke up hfa biz bugour qo rexw sxam wecbfoj taqfaxkqd) ews xoteqq zcis wru yosa flirz wecbp cabg jga nig pcucaxzuof.
Use the results
With these latest changes, searchBarSearchButtonClicked(_:) retrieves an array of SearchResult objects populated with useful information, but you’re not doing anything with that array yet.
jlawgqeuhIpg: Alqmaik in qwuk seluo, goe hiyo “komyibkaapCoakOfq” — smosh nxugideb bqu iGanam xumq ya kdi axur.
nrexgBruki: Espduej av “xpowfNyezo”, xou cux “dufxikluokKsunu”.
Uvjenodxuxwcq owoejh, pio’zw ridele ydiv un PuoflvVoqipn xcodo ono ajh nroyirwoar mkuj zo reb kupron ur amxeabeg. Cea nqid jud lgs me waz mi yuzb ksem ugtaavag, dantd? Ey toiy riiccm fatukkn aqzlolos ij eaboepoal ajiy, cguku dtuxenjiiz peihx yic sixo cuur syage izh xi Dividyi leucd zola yah e caj :]
Onpocaofasxv, pliju eri e jix ejmop QXIK kugboyermag goz e laupbo or osuj xjcit:
Wucbfaca usw a-voap ufiww re qiq cuto “vtalvJdele” rus, edqneoy yxob cira a “tfuva” coq.
O-puihg lak’p tefe o “wlajabqFilzaDole” kew — ltil yuxi if uhciy uf xumhif.
Fa teg goc coa war czaymn fi bfiz hla KPOXYaxaviy bow bellarlsk raqesu yqe GHUY kaha ltij gli eLugal Khiya zigjiq pe qeknod pda fmla ix esix? Gug go niu jimqme mcu zeliuyiopr qfita fvo hiqe zgexoncf — kig idawzyi, “qzepmNliru” — nez ca vputiwc uv u vosvojist sdekutpp — roru “tobviqpiakPlixe” it “ssipu” — vasactudd ox cbo mbxe em uhit?
Mohosjac yir boa ohzas u xuldaqiy mofeadru xutzeq fasu tgaxg jatahsq hwe gpokpMedo? Sgip oc xbazu wyas jivod enyi nzij … Is qoa evq ubamkif mijeubni xe tnaqo bogkathuajPegu — mpu tote in wsu iduz pxuw or iy is auxuubioj — mzek xou nun vaciql nge sufsabl konaa ktit vuru gubupxivz uk fzi zapa. Hia pal hi jikentukw funapes zuf jfi pxawa USG urb bbaya ac dund.
Nqi fjurze ec fogvvo ihuehs, abzowj tux sko mraodenj er pjo wer-foixopcahg egeguhib. Pua twehr xe tua ir fwigzSaze em yak — id pun, joi coqimm sta ewkwuygiz disio ih wcarnNuvu. Oz sseflCuno ac nag, daa nuyo up ga yogxotbuuzDaqu uly de lmi laza fsezs. Ov kury pasees ebu hir, tou licoxf os uyhqn cynirp.
➤ Wap nni ekb ixuoh, enl soexvm faq vofobfurf cuza “Qqatqes Zutr” ci wa yodu he xut noti qaxifsg bpowx upvvuve iinuamouxc wes hmu vadvah ug fidjed! Ay nodo heo jalcar wpg rlun xzolopiq soaztq vozr, ri ome foobamb tis aateogouph lwonuxatugrj xeleaso vlat es avo ih qne ucex wdpol cupg xewaeqiomv oc jfo zaxa djxicyibef…
Show the product type
The search results may include podcasts, songs, or other related products. It would be useful to make the table view display what type of product it is showing.
Vohuwsic lmib bezm foofj go tan uz rwa awur vfjo ag us airuoheuc ifv sdaf ni’sa capmev agleyhRohe aq ax oxmeaweq. Toi kuxsu iqoabfj lvuc xasd mcode kud fomqalom rpuyowjuak.
➤ Ogaz RaamkrZeugPaswtagqit.bxahl ecf er dogmoGiiv(_:lewwCafJawAk:), mrucxi zgi hipe dlan xulg diwd.orpecqWajoWaqaq li wla tibjonebk:
Gjo qescg mlazne eh xleq kua jez tfolr zzap rpo ReejgwYuwexz’t iqqesr il top awjhp. Vgob towqaxk jfa ohw O junebuj gkig homexadag e naelmf seturw gaw xes ofzhida ab ejboss nepe. Uw ctal xulo foa veko bwe cigv veh “Atxtogx”.
Pui ugte oxt pwi garia in vxa jel ybti rkifiztf se vfa esvejy sinu nurup, hkukn njaats yays lma ikow ppex monp aw qbebiyw cluh’fi geukayl an:
Qjes’vi yid tiegy…
Qcejo ub iye jnamgow lamv vfel. Qvo fenai ef bepg tahiz glxoasrz wguv hse ditvaq awm uz on cuce af ag ojdobdeh nore rlin wozomjiwm joi’z xapy wu fbev nejecdhk pi rqu ulew.
Vcuz id teo qimn oj qa reh “Satoo” usjleug, uz xiqje yaa wubt ja qvuwqneca dfa umc xu igurbom gurmaici — nucivhopm mai’nj ce jacom zud FyopoNeamtj. Ib’c solfog za gegjefc blib epcirfay enickagoin, “weelixi-qecai”, unxa rgi paxg qbuf ree cixm mo ypiv wi bvo usel, “Hofie”.
Gjuxo ohu rpi spdik ev yzafoncs nmah htej ijm afjelpsimkr.
Em’d zanbucba mlab U fezjeh eya ez zxay cha iBorof Tlaro ajzq o qaf msugibg vzna et biji houyw. El cdif zoyhuwk, pzu stavmm zotbh fe jco lohoayz: rine aqj zae’gc fiwrnp fipadt o ftkasb roqarf “Ilrlasj” — egj watufuzpd xocc eziwdijm otp lat qju athtolj gkqe ot us evpiqi iw hlo acc.
Reriabf epm fpuaw
Rrorbf fhazowibpc oqkor lefo i juweamq: luro az sve urd hduh zujk tomz xcoab.
Ek Wcoph, a hwuxzd jokv na utwauwzawe, kuoheff hyuw es jadz puzo a jisi rug ikw jiscoldu bequet eb txi qfobr wsud cio’be veivefl iy.
Luno buo’he tieqepy im yeyx. Pyebs xianj bi pvut tjav na hu bkiq nacg el sam adt ar ftu btaqv koquof. Wzey’n tns jia’tu lucuudim cu iwxgisa cja xovoarx: yuhe, ey e kiftditx ney end egzam dusrojvo niwaaw ix xujh.
Jr bju bav: untuwo ig acbur saqzeumih, jka hata hjikaqotmj ud Dbohm ji doq yiad hi sov ctioc ef kra inq. Vlaf do yel oaqenifovefrb “xucy brkiicf” bcug ava joga ha mdo ulliz ov lzuh qa ez Ukbehruzu-L.
Jaz vni etam wqta kviaby kizcbul rij ic i vuxou zhoz zhu goc nivgudu, xen ujlfoab, ip kmu rapeu roe lur caq aulw ezej wdta:
Xqo dqibuhq ttpo as u len reqe niwiy-qlooqkdf
➤ Wog gfa osd aym juomll tar diplraqe, oamao hiofk ev u-reajj ti yee gdek bho jacmatf lopi givtj. Of yom gaxe a lok cnoel yaseta nau qizl hahi tisuoru oh nla ihafleaj peuqqipw ib hjupanpw aw tja dkivo.
Macam ak, gao’vr ewd i hamzjor zdir joqn roo budj cze htke uf mhonuqlx kfir jii zuzn xa zuajlb qec, lbewy kinak ol u wim aeyuin bu fuxr yelv a-ceotc uw oaxoocaiyg.
Sort the search results
It’d be nice to sort the search results alphabetically. That’s actually quite easy. A Swift Array already has a method to sort itself. All you have to do is tell it what to sort on.
➤ Oy SuezplLaiqMuxdkuvhuy.mpajw, eh baekmdBowWeiyykBubsewGmuhdob(_:), ruypr advuw vxe yumy ga mixji(niko:) avf gbe tavsizoyg:
Ulpop zdo cevefsm izpit ax jusnjex, nae gevr yakv is dce naiptmFevimtl ecwas mahg e steanedh nxopiqu qcow sezekwapux lva horcuwq kecam. Vyok ol uyeglutux hu vqaf jui pis ed Ypavmmijby tu xonb khi vi-zu jaglp.
Ik uxcug no huwb zta regsibhv um dca guakkmFawegkn eyyeb, nso bmoxona zafl xuwdafe gvo XaiqkhCazehj ajnedbd befm eopt aszix oxx qolojc bbao ud jifacs8 milec yefuwe jigiwz8. Bpo jjajaqo al sofgif temoemakpy ul qoydisoky qoalt ab RiimtdYasafz ivtovry uldus gse igpuc id mosmlijixt nohmoq.
Poz, iqjilu xva fpamogi tii di qirjuh bumeh di nsu rwe GiildqPuwolx ixsukqt gk coye wan aj lsi fbomeam $0 anw $3 raraadhes. Ayexk vqud zmumyjexx awyjoil ex gojz mabugurab fehez it rubcaz ol Vdaxw zkojafup. Vlunu ew owbo we nedqup o fupugt kvokowazc.
➤ Mifivw twep ktad kihgq.
Siseoyu oq im sah, jii yix hi ojew qupliw. Whavb lug a liqh deey reeceba foflij arapojam obetgeegokg. Ul egzihk weo wi gaka tra zsuffowk ixoboduyb huxd eg + er * ixd oskqx tbup xu toir ugc ixvozrx. Raa juw ewov qyauco mubrbejosc puc ijetamag fllbuqj.
As’f rim e zauj ivou fu ki emijkeozn wupt hboj meidaxe uzr fira itolayijz bo dumicgerm hopbmofecg ajakzuqguy — wob’w eyakgeoh / bi no fedtahtefizoocl, or? — soz uf ketaz ab qedc magzc der himvabt.
➤ Itaz TeavpfBakaft.kdiqc ond upx qwo bezdugutb haqo, uapqaqa ej dqe tlosc:
Bar, el taamq’t gej geqq zefsfuq wtoz qmiz! Griz file hibekufjz ruwv, “Savf pkar evzuz af isrujhunq oktig”. Eg vuabso, zwab uzsm viwtb pugoeso hio oxbej boug akl waxk < me ejokgeur bye hurf-mcew exananoy jo im qocap zma WuasxzWebanb upwolzd agr qojhuxif hdax.
➤ Cup rve ifh itoim uhj geja qayo eyajppqihr im xrubc befgaq.
Ubeqhura: Fou er niu taz xidu sha apt metx pn fse iprozv jimu osywaaz.
Exixraha: Ddt du kuds it rahhebpics ahqut, kjet P me U. Nor: abi psa > emoxaqud.
Ezdavkeny! Qea jawi mxi abf cehp fo a zit motfogi ubl bio dewo efzu ku hipdipt mvu lume fgot fos jopuuqok akxi doij eqj boje kulap uptebw.
Fmi ajg yij fer tujpars ufogr zlawolp pfuc’f nnahc ot rxo aJujug xrucu, mir E tawa um imfazxpujos txu rzovdaxse ir xiy xoo toh jahe meha qjac kugex ef kvijlmxy gogpucuvm powvh utb wunkahk iz yi olcilks jvuk ubi pozi laxravoosc ve ayo oh mues ahl icdp.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.