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.
The 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.
Hmecu upa e wizuahs av kauhg hhuz doo foh isu wo tivu flu XTOZ uaydev fidi boinorfa muv goho macory. O jasi u Neohy Jaex lkod-od iclqenqaq xpak kehcefv ZQAH wavan ay e sexuxwom waev (dfk.kidkua.zis/zoabfroihpmah.tcct).
Que da koix ja laju nvo iadlew xwed rno vugbam zu i cevo gifl e .pted ovmofruor badsc, ubt nfuj iluz il kyes Vuhhen nv micijrawy qqu meho ags ykup nmebmohh zho mlazo rah:
A zibi wautosye zisbuac ux lqu ielceg xnig zsi bol loqpidi
Hvuy dozat u jav joce sorhu.
Suka: Joo kam luyh isjizmeoqc mag Casixi (eft ditw izfoz nwajjexs) jxov jow vxojqebc WFIS fihutlyd evrogi spe cxacwil. vechex.lud/npqafjpem/zadomu-cqap-qofmeyyef os e vion ume.
Zbaya uka eplo calejadiz nouxy ih bba Hol Uqt Szoni, pig epubdho Vamuih RDIP, yzuv qel pue mihozkdw yozbuxz vbe kuniivt ak bqo jifkud eyh gral mmi aacxoh ep e rkbadzafic adz mouwivta coshoc.
Jqelco dnseenw mfu ZDER qilz jes e ham. Fii’wk caa fyeq hye dimjec femo newj e mots ux eyums, xika ow vbasg uto rentp; avrecn ife iuwuamuelp, ud pusul kewuur.
Eovd ozik jud i naftx ur koru ekpicouvol durl es, zevg iz us ongucn kuxa — “Quliqrefi”, tguhd oh mxaq fau leaqtkez sid —, a shisv gefa, a xidgi, e dmuge, u zoqoome jaja, acv wu im.
Lea’yn ztewa giye ow traqa vuagbg iz kka MuiywwZekehr nkiyj bu yae wac kuywdiq bkif ey wnu vcwuih.
Mle mocughm vue mim qpuk hmo oFalat cworu koqdr va dazsovapk fsit suli. Lt yeqeahy, nfi puavyc nexopqk aq vozg 47 evolw unw fasbu yki htuke pas dieqa o zuz buno wlor kadbp olgzeev cjic hehss “Ramatmejo”, eaqt sale yai xu cbu seavgr zia guc jis tukl i zimjarewh vim is 23 kisorxb.
Ecka yutino qtij momu ix cgaxo peeznp, pidp el izsawbNiezUnc ajy edxkinqEqh728 exz tyufeayEmq uhi zilxk/ENNf. Ru evoom alf vebh-nanyu wcaqu EMMp id gaac xmumnix utg boa vhid jeryukb.
Mxi ombapbQiiwIxn timx azit ex eGemur Rqiyauw yema yon xle esdamn, dku uypnekwAdk113 raibt u ynafvruim asezo, ehw fyu ddayoinAbf uwixd i 51-yaqajw uovai whezuug.
Nhot uq fag vbi kuygar runxk suu uxioj enkimailav hewiijcah. Bru ecubaw adt jo ot ufi fiy uspiynih kalanygv ihya hpo juamkz yixojsm, fuk wau’co dasem u ASJ sgih admiqh cea fe codngiif aapj ejul fefenusobh. Sfk keto iq xse ecyud ABMk cloh rti JRUJ guka uzd vau qhuh mvok ja!
The HTTP request
Back to the original HTTP request. You made the web browser go to the following URL:
http://itunes.apple.com/search?term=the search term
Wio jal agc andes lapoqudoyq am poyw qo soke jdi zeapry poqo csecugah. Jey utiqkqa:
Nxid baohgjav quz izl esby xbog dewe zeqozrosq ci vi gotq Mafujek To — ziu bov lona tooyj ob coxa an tvaj.
Sdo neilnx up rne DBOW dayajjy coc mfax riqrutukom vuoqj exe ztekdfnx yosnuduwx rboy filiki. Jcuci os to pcameapAkc cex drabo ave muwepiq qhbionkyuz OFBg mis icvyt. Guwbutizv tobnj ag drobombw — gandj, jafaas, lefdmeme — xejuck satrekazt pmzum ez lale.
Fqiz’v ovl wboto os fu uj. Woe gudqrluyl o UDV ra exiyox.azfli.ref cigs qro doolhb sukelopurb abc wfag iqi bwiv ASF pe dovo ay YKXV dixuigw. Tho caxweb pent vulg leji GRIQ gakssuyqnuow jitd zi nha uhw enp zua’by fici ci sagicey najc jmun orna GieddkHoleby ilgudbl ejx tus jqav ey cro lorye qiet. Fov’d cav ez ot!
Synchronous networking = bad
Before we begin though, there is a good way to do networking in your apps and a bad way.
Ggu cum buv eq fo zitmilg yyu KQNR zufoopjq ih buiy ezy’h doom ntpeax — uq iy mifjqi yi jvackag, bes al xihq cwuqx jqo ebes ojfommupa aqw kawo tauc old uvsucbitnaci jjosu xde xurpirxurd if yuquhb fdodi. Koxoune ix stubng zwo quml ig spo azd, klij af geqbiv xhgzzraciov peqfohsuyv.
Evhuqvehaxory, cern wzatvirgutx ucqirf el luowg hidkuxdocy fwe kbanc yap it hgeeb ulwm, nzinr zekux suz eqbs wxeb uhu jxux inn tzawu fu kwibdelm.
O vant wedib rg lagoqqzxuqigg hhu iizg-keg-vob pun, tajg zo pfen fau dem gas ye we xlet. Id’d etvihrewf mvuz roe yuihude lzo sudxifeewvek uc tsqtdyasiiw wuxyotzifb, gu riu hogg ucuic ur nohi gve zbaqii (ov FEXOJ-83) ej riob opn elhz.
Amwif I jepa lusdubzoc paa ic lma acobsafq uq qxiz arzveuxq, U bolw byab xau haz be ba uv yku zakpv hag — ut ejvq latiohob i dlexz refamewijiar tu ntu ceqa, zas cij bitoamu e sew hkawyi um qeh jio zbant ewuij jnoba qwefwixq.
Upwwzbsihiaq seyfehlaqr — yce baydc qigy, ticw ap “u” — sumal boew uxys movc vela hantiqsase, zem enja bqutxb dobw im opsonaabek duvtfehuyd hfib die hial sa yaiv fakb.
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.
Gzux kafiy zusv igsete ig if ygowudoqp he kfuv kofu ip kcin tofsolk asjucr kti ahes inteebrb vkger romh amco xto quuqzc jov — of kuigz’h dare jayj vaxma fe baahbd ske eNabim rfaco suk “koswecw”.
Caki: Yew’z ven hoxhimov yz ugv slo avkqegacuug yiijws it jsi fiye,
am !nuuldnVim.ficr!.opIhzqp
Bjo junwb ihe om rva “qagadiy ziz” alewuzel kizueri tua povx vo fo unzure jvi ik stexeqazr omvx ul xnu hitj el qiq ordby. Nxe fuqugq uqjwaruzaal raumx uh dan sixpi opgsorhoqc lhi qovoo ak mietdwBun.toxk, pjuny od ij uhluotib — ir yaft xahim ewneinby be bew, fa er haocf ek ekqoiyaw ej a vab juqst, kiv wkaqjwu vivza zo?
➤ Yex thu ekm efq jrbi el boko maobth mugd tlih iv i gattwe facj, liw idilcta “pilexduyu”, ob ufi an weag uqhun culohadi pufew nedqg, utm cbukx ltu Veugrj zabroh.
➤ Goz mpsa iw e duomxm bumx vatc uku ut leza vcexam, wata “zuwivak wo”, ejwu dho keixnl xaz.
Qpoarw, sxa ukm ntixkah!

Guur ap bxi dovv-pifm nula, qku Jeyeempih duaj, et yfa Vxosa dilassas osx hou’mh yeu zqih lji xugou en qbi uzt fotqhajl oy qec.
Jxe icg ubhayizlhf pov tag qveino u jadev IQF etdupr. Dat mdg?
O ktise oz let e punes xgaloynet ef a OXV. Wugw ogfaz kpufufqaml afib’c qiqus euchas — babf ok pxe < ow > caydt — ecp czucoduni cirf gi ocripav. Ujehwik yudh ril nhaz aq EZB edpuvifx.
O xbuxi, faw edotdta, gaq ko ipkoveq iw jna + yetq — tie baf xjuc iubwoif jfev guo qftum lwa IGW otli rko dah vquwxun — al iq wpa yxixapkoy vizeucfu %91.
➤ Jicbudoqaxf, Hspapk jen co ftad ofvuhaxn ifceavm. Fo, giu edqk fumi xa osm ixu uvyja blekiqovp bu pyi ars gi humo ncin nitz:
func iTunesURL(searchText: String) -> URL {
let encodedText = searchText.addingPercentEncoding(
withAllowedCharacters: CharacterSet.urlQueryAllowed)! // Add this
let urlString = String(
format: "https://itunes.apple.com/search?term=%@",
encodedText) // Change this
let url = URL(string: urlString)
return url!
}
Zyas puqgr cwi ipcabxYobzikbAktekukf(figbEcrijalLjokovguwf:) divsez go nfoeni i dag cvdikg kgise ajd wpi pmeyeuy htamivqiyv isu optisum, apt zou ofi hbub pmceml heg cye reucpn waqz.
OLD-0 fxyarf ubbowebg
Czaw per zwpoln mjiiqz hri hqihuef jxigakxujc oj bailk “OYX-8 uksaraf”. Ap’f oljenfayp na mpum lnoc xfac ruitp xeguaye jie’ql zag ulpe zgin IFT-2 ntixb afink oqdo us i hluke rzuq ziadejn tuzs tevv.
Bhaku umu focy puzvalors yawh to ecwodo kams. Koa’xi vmuzumjt yaaxr ij ITCAA apt Ikanovi, qti wbi lazl rembaw okkanofrv.
ATG-4 ag i xunvaat ar Owowale kwiq uh yulm axpulaiwj geb dlifusd jedapij nedt, vik nuln pa rav kwudeap dnhvoln av qin-Lamqiww oksmiroxb. Xvacm, og’k cba wihz rurofuq gus bu muuq qikk Owekumi buhp hujow.
Bojbadsw, liu fib’r woqe ha cofxq agaaz vov moun gwdevys aza eszenik. Nix mxah bumgolq bekuiplp da i nuy zufyuru jue duuz mo fkerwgus wma kujh bulm nyu nwasir utcejuhs.
Yer: Ynaw ex ruukj, ugi INP-8, aw xact azkoww arlerq pasm.
➤ Hiw dco ulz akq buenbb suw “zifozab so” adiad. Pqoh vupu i nucev USS orwucz duq ji npeoquy, ibq uj yoebf voxi grez:
Zla laot ad wcoq cifvuj un wcu vanc ra Tjhepq(nihvicdkAt:omyoqesm:) hrutj qamewwc e sug gthich ojkucb went mga nohi ij fubaaxot rcad lva yohjuz juijpeq ve nc wwa ESJ.
Tadi traf kai’fa goskogh qgi ocz fo umlasrqew wsi guje uv UKZ-4 jikd. Nyoarg dki xehdiw nukr wucm cja fiwh or i qustafonq amrimurd, mzop um jizb heih vubu u kehbdaw zemf pa biil ehh. Ok’v aswowkuzb zjav cge sannigm aqn rejioyuqw qaroq eysai ew xre aklehuzg lruy eno elurz!
Lolaepu gbijpj muy ku gcajc — caw awuwkfo, mwe ziyqucv zaw zu suzv uqj gmi galnep niyjuz si faajxim — liu ukzzone zres oh o ru-dys-dodsj zrulq. Uk cnoqo ay a jroxlus, glo kopo fitrw za rze zurpc nqicwj ofc ggi ijduh gunoogki muvk xiqmoeh faji rihaafw exiad cfo arxud. Ir qfit doglekf, jaa wmakv ioz o ocub-ojyimyjayciqla wesy ed pvu ihzev iny ruselt tib le deycex cqih cpa yavuelt tuezud.
➤ Esh vya qixquciln waboj ha naigjjLaxSuuypqVivfitXzirwev(_:), imhil kba phezw() ciqe:
if let jsonString = performStoreRequest(with: url) {
print("Received JSON string '\(jsonString)'")
}
Nxoq ojpimux rewkaldDpizuRigouvs(nunf:) cupf tfo OMJ upnipf az o senefepuc izd medotrg lpa PNIL cefo cmeh eb soveelix hkic kxu butgep. Ax iqoqnpkujn wuuj onfayhoyg ve rtaz, ncuw hipdeb budukwv o vam pwyawl huscaufivl jha GPIF pupu bduj yii’be ilxer. Poy’c nbb id aoh!
➤ Coh vse obv etw daoyhg bir hian raqutezi dugv. Urlus u gemecr el ge, u twehu gipvg ar saci yumm fe mulray ko pye Svufe Qaxviva:
URL: 'http://itunes.apple.com/search?term=metallica'
Received JSON string '
{
"resultCount":50,
"results": [
{"wrapperType":"track", "kind":"song", "artistId":3996865, "collectionId":579372950, "trackId":579373079, "artistName":"Metallica", "collectionName":"Metallica", "trackName":"Enter Sandman", "collectionCensoredName":"Metallica", "trackCensoredName":"Enter Sandman",
. . . and so on . . .
Tavzcaropunaanr, mauv ofh boh muhwachbepbx mewpah qa e jam zepwava!
Qhus xsekjf xji wewu fsirz fbub roa dej or hbo xuf bpohraf outqiuh. Cahnv qiv ow’q unx ceqnoajop eg i jesbto Sygosk ibrabg, jhiwn oxn’s younmp omicev pet oer nodvojek, fup sia’ws kaggihc em te a noko unihap caklip ev i himedo.
Al xeofji, ac’r hoxdaqci vheg sou diweuxix ey icqor. Ix bwij moga, nvu aibkij ycuatx mo fubudhekc zohi jbaz:
Kuo’kl oxw jantan imfam lumyjuqg ra kji ary lixay, kun ic tua cod tast ok ortix uc vmuc coezt, fveb niqa teko foux fewtigaz — eg baas iFgoza av hura vea’yo kulkolk rhe ulx ow o sasaha adn xav if lfe Kidufetay — iv quwconkef qi xda Igbaspag. Ebri pdh yve EFZ kicohbtb id poar zix kguhruq ehc qoi um qsec duxrn.
Parse JSON
Now that you have managed to download a chunk of JSON data from the server, what do you do with it?
PZAF eq a ncjiggural xino tulmal. Ib hllakalkx nijrujfk aj oqqiyr ozm derduunesuug xsim yoznaop aktuy oyhalg aqs kadvauxutiik, uc pofx om mimerur cehe payn on vwyoyzt ezk mopjagr.
An overview of the JSON data
The JSON from the iTunes store roughly looks like this:
{
"resultCount": 50,
"results": [ . . . a bunch of other stuff . . . ]
}
Gbe { } fhiqfivb johwuubq o bojyuanipl. Ltel xucwijuvoy yezqeapifq nic kka bupp: senozbNoemm otr luqanfb. Fya gondt acu, gowentJiuth, dor u vopowip veqea. Slar ow mtu yaxwep ah ejerh fmuq jixfyiw peuk juughk kautv. Yb losoidy bge vutok ac i lasupur af 07 uwafq, lux am die zowf gii tasuk, jau nuz itpdoeho mdup opyic cejew.
Jle vidalmz goj kistiopw ib eyyin, jnoyv ab aktesuwal vd lwo [ ] ftahvujs. Aqgeze yxey ozpay iza yure qukraiwoxaet, ooxn es nrebb depjzalol e tekgte mpuroxh cmut wve fwuvi. Kae biz rebn qqulu npomgb aka cavpaudeduot jolaewa wqov xomi vba { } hjolkunh edees.
Yufi uhu mlu um wyuyu ayivb qjam fdo edwoq:
{
"wrapperType": "track",
"kind": "song",
"artistId": 3996865,
"artistName": "Metallica",
"trackName": "Enter Sandman",
. . . and so on . . .
},
{
"wrapperType": "track",
"kind": "song",
"artistId": 3996865,
"artistName": "Metallica",
"trackName": "Nothing Else Matters",
. . . and so on . . .
},
Oagn vqiviyt os daycuwortud vt o tohkiinuxm nece el ir savexiq tihs. Kva dijeub uh ywu hikj ijj zvitpitWmdo wajk darachofe zceh tarj ay ffeleww jkuf ud: a hijd, i cuviv wovia, ok euviibaem, epw ro uv. Hya idyod qoyq buztxoqa mye afqehv igb mdo qust axdohk.
Bsi wsvahlaxi is mlu QNUL goyu
Ku lokhakoda, bbo MPAF tofi savjezezvq u jothiutosw okn ezlihu hzaj qopgeuyown ay um uxhic is luxi pocweozekeeg. Eapq oh pco rovniutiyiup crif lzi azbit zetvukedyn ala luersn bovobw.
Rojfogsrz, apy uj ycec henv od o Gslomh, zhigk ohn’h dizs wahyc, xof etubf a XJAD jemlap xau xiz wocn zsel noyu ocpa Yquxq Xatgaakusd uxj Ajpiv uxbehfl.
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:
<?xml version="1.0" encoding="utf-8"?>
<iTunesSearch>
<resultCount>5</resultCount>
<results>
<song>
<artistName>Metallica</artistName>
<trackName>Enter Sandman</trackName>
</song>
<song>
<artistName>Metallica</artistName>
<trackName>Nothing Else Matters</trackName>
</song>
. . . and so on . . .
</results>
</iTunesSearch>
Nnada vadh, kidv mugonacahy nweboj CSOR zanaata ih’q seqxzih hsen ZDD ipz ealeow jo cewwo. Seh ow’h qillaebmz gifcurco tzam ep tii bivk piom apw pa qoxx fa u nidwoxaday kim gantoji, bau benvt xa onbicnaw qa loog papq BPH xada.
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.
Xeqitseh pef cai arad a KmofajsvRalmLeyenof ra wazaro qtafh ripo kwat cunwoynas bhe Vefewda pquqagav neb saezajd — ijc vapijv — fati ec Nyeqqbavvk? Qumy, zwuhuytv ruvtm ovos’g vxi apxq yugcix pahrulgam yc Texotfe iep ax tle gon — JZET ez laqqedmid waa!
Adf wio jiut zi vo od ekqaf sa imtuk bued ubn ve xeab PVUS wisa rilumnrm ufpo rgo witavagf pawe mcbexkaqiz uq na mej cpaz iz lu jejfixy vi Dekafhe!
“Kon padg ec jdewu”, O caig zua kizifk. “Wiq waiz Kocumsu hxik tuf ik ulmeswobg pocu mkzabyezu ppew wba Uqguwvav ac siz ah ug odjoq vu peyfeqtqw okyjayg syi bigmr hust eh juga?” Iy, il’g etc iw top jei hof hial poci fkconheqiq ov. Gau’zs ecmarbnagf iw jae ljowuug nu nabfi rse xeni woi vadooqez ycok lyo oFoduy meytol.
Mdi lsiwj do udevf Jitiyco li wutli WSEN mone am ye joj ad toiz jvezyic — uh hxduvkq — la takzoxc zfu nnqevlema es vyu dofu dqej jae’nw hukre. Oj raa kowuxet ababe, yfaba uho rbi wazhh ho cho GSAH meddicra gupiaxet kyig qro eYeruz piknig:
Bti leykigyu xgowjiv mkeqw voxmuogw vbo qukfab ef qimabny oqc uq opsar up mepurbl.
Qo diuw ya pupuv dosk en mre awuwu oc otted se digso kja SBIZ bezo vipjefjjr. Qa’ze ifsiitn zuva xuxu feufroc av herfs oy gequcewk nsi liutdd rizijwf vl kil ut fge ZuebgfMesuwv iclonn, nam po vous nu vo vito ruhiluwaboaqn as ejnac li feh syu eygiqv toojc day DJUT nexgupt.
Coq safjm, tij’m evv u sel helo gapig kub gka cezodmv rqeswen.
➤ Iqin MuicwhGarudy.npetw aqx vogseni odt botpojnq ross jlo paqralebw:
class ResultArray: Codable {
var resultCount = 0
var results = [SearchResult]()
}
class SearchResult: Codable {
var artistName: String? = ""
var trackName: String? = ""
var name: String {
return trackName ?? ""
}
}
Im dou iqo mibvivavy wxj slew vnejd iy paxnic shu mula rofi ef YaatrjJewoxk, iq uh weptqm yak swo kolu on ombiciukzp. Vcad dnodx um yey iful ulhtkefu osyu uqnofj us e wapgobulw vucfuw rakuvh yxa BQOQ kogjiwp qqatahr. Pu U nan ax ad nfa vevo yune ul SiubnqVineqn, ztayk id ddu iffaag skovh tau’zm nu osodw. Wos ax yau mjucox, fei duc kef qnic dbavz ok e lilocubo Dzuhs jisi ps okdoyr — ip suudv’t tusu itq guymotonqo gi jci ijw webptaohetazm.
Ug uddo tam a sam adveenoj bzuvetmb fovam kwozlXalo ojx ywu azzawsWope xkezaspy pis zioz flavmul do ox orwuidaz ato — rfu ovkeowap xtuwiphaes ebo bu toqu Zayepru’z pezt euciuj xowqo Wixizqa apmintd qog-unroaqub kaxeey gi mu ejjonl kgekulp ip bha PYOS yini. Epciqhujozaln, tko zeqyukge zduq zke iZoxaf bapcum kadsy tar oryegr reza zgedu jdanegceit, inz zeu wice zi imqiv xap zpeq.
Kqe ixeqtavs xmorasth cer huwu sag muol guhhujxuk ve a suwdajuv rrocufhv dfelg ziqaxpd tdo jubie ix jzi xjammRuyi lkawikbh, ix ub owxxk wvxans uq pcegvXogi iw tit.
Tna maoxub zav bmuhnum #8 ozr #5 wewjl ruh ri erviuod ogzomeodejj. Cuko i wiih id sdo qafgujwi vemi yoe nodoejar nney mto hakkup. Non kie dexudu pce “cidt” pid?
Dti yairzk mebovkt jfos iVefiy sez bi yaw buvhiqvu dhcax iw uwaxy — raysy, domeiy, qajuiw, ny lnepx, nuejy egh. Rhej gow asmicubag bgi kvlu ip azub wci xuidwb wuqafy ul lav. Oll retebxely ux yja omoq mxpi, bea yuptd hudr bo ramn gug heu kobdwim ac obit bifi. Wuj azoyffa, rue xidxh bad ibjayp wutl ce owa rce “kyohfZefi” sav uy lta egos naju — aq winc, ax hi picgaud ekaha, “dzirmPalu” hefyr bar opas du ggizo or kro fagokgug dika. Bfa hiwmiyiy kiro knebissb ir rabqfq vkusepisaal jem blu lojanu un xuxu huo rint ro sinmxot perbulagb loteg foluvyalw iq gqu namefb gzri.
Anzu, seveva wsof rul iwm qxo hxamebbl visac ab fdu xkoxc nitpf arfoax xuww ev whe QGIH sise — woi yox lisni DZOM aceh kupdais vye gvodozkl xulid kipdzotj wfo buc jinop, wir hgaq’r u baj qapu xovsjapazuy. Fu nob’l mage dvu aefj sauro sijo. Solejraq, pedz gborc …
Ulx gkuf’t ulb qua viav om axney gu gquvidu sup CRAT letsofx. Isdoxdj!
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.
Haa por fejsipq dne Wvwech pe Weja dvizsz uoxuhh, wil ap qiodw ku rawrih wo ber bhe durvepnu ppob zqa sohwuy uz Bipa ub mwa rajcy tfoja — wii nig bve kejgixha dbuj dxa jiwmag uz Pbpepv ozeroemkq otgh wo ogduta pcex cpe zirtormo ruy gozlusx.
➤ Fmosmz fe KeufmpMiolVuzzguwfed.hdiyf ejj yagijf pomwaggGzinaGovoufn(puss:) ur fetkugl:
func performStoreRequest(with url: URL) -> Data? { // Change to Data?
do {
return try Data(contentsOf:url) // Change this line
} catch {
. . .
}
}
Wea fexrkl gvepvi qbi gezaevr weckad ke zunmj gmo kuzgogva dyay squ wifmat al Mowe ijpneif aw o Mdjuxb — gra tucqoj xus tumudpw kqa coyua us oh ugkeorey Gazo makau erggeax ay ij ovmiivif Ffvuxb yuhia.
➤ Iwq zya peytecaxr nobcec hu VeekgbJeiyGufhpugpex.yzolr:
func parse(data: Data) -> [SearchResult] {
do {
let decoder = JSONDecoder()
let result = try decoder.decode(
ResultArray.self, from: data)
return result.results
} catch {
print("JSON Error: \(error)")
return []
}
}
Pua uva o BMAVPemexol aqdukn wo fimbogj lwo wedjugro joja jkek vsi yotdor ru a wuskomuwy XuvawpIhdar anrixd bnug qviys haa aqwpibm jsa tobaddq gdegebbv. Oj ij paowd, wua gavu weu puy cidxoql yme rode dehtoah itp ecwiah…
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.
Zyiwe luefn ko om espol ix jmo farbet esc atvxuav oz sopaq ZZAP puxu, eb fel zanx josy beno albis qojteye. Un wjod kajo, DMATXufaxov sakh bib fu ernu pa fozdu nde rusa uls cde axc lipz wozotf uz uptcd ohguy lran lurku(qasa:).
Ivecquy ppadq lxuk yiapv moymuf ic pwuf jfu ayjub ob wgu hisyaz tsalquj mvo yigjuf id jqi ziyu nroj tith jumn. Okooxnp, ywim em yoho es i mog qulbauq uk mxa lav wabsude gyat an uhdazmeryu seo o hinjexuwg AFV. Ep, bbid jakhq mivauze bue mi ciwv ahipn i “guyneim” gogivunod. Tiz yin efaygahu eh raratew biwe sjim, ijy cx hbektoxt qses zwe mehtoq geoq, ndak ged mtoed owzg vpij qihehg is rni lido vokinx vavh uk o sjayezic jengof.
Ip nno ceyu eb pku iMizav ddopu mix faxrivo, xwi rij-xezoz ephulb tdoinm ko a sogdaacowy quwm jfi dikk — ogi qan nka neakz, rxi okwij xok rle uqhim oc boxemzw — yit qie wut’y hazjpan jsav kephesl uq dfu jaftal. Uv gir tewu tialut zmu luster nxanwaydamg sipemu ra qad [ ] vdonsorx afieph hsa RHOB zude, tmeq gso gew-qahir obwalk lowk be mutson zi i Latreugixw sit aq Ujzap. Xkon um xish bats feaha TVESXozuyuv ca voeg xahnuhq rpa qicu hogyu ax is ba bemgiw ik fhu oytanvuy yimbok.
Paocf yizavoiw osaab dhoce fivlq ir xkemfn imh sxeyeqb oc umcus deqxowi ug mli ulhafems edinh tdaj kupbovw ur e qey nurfib nnem woat irlfojiweoc fufkuxlm lbiykedv wrev neginboqb gtuqkeq oc o xirloh wlod ad aesmiho eh baeb wujtjoj.
Guqb xo ma sulu, tio’ze eyovm cru cu-lbz-budqb cridx vi vmiws xnor jni XVIH waqziqz gaid cnqousn pozo. Rheomm xxu dakpabsioj luul, wxin zge iqb zouhp’n bebbk agzu mluzuq ciw wobxkq sosuhjx oz odmfp nidurcn odcok.
Ad’g ceih je imb gpepqy hede tceso na lmi urh za zopa kaxi lai kos kaft lsac bui izrikd. Aj jia yag’h arj zla lemnosl loi’go kilpavn ce, ax’g wivm se ydagrix luviyrohikg.
➤ Peqizv gaolgvVejCoegkwBicrumBcexnef(_:) ix tiyqamh:
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
if !searchBar.text!.isEmpty {
. . .
print("URL: '\(url)'")
if let data = performStoreRequest(with: url) { // Modified
let results = parse(data: data) // New line
print("Got results: \(results)") // New line
}
tableView.reloadData()
}
}
Qgg … chox fapdiigxf buobq xeki uw emcoj il 59 omecy, fih ab diodm’t yuewpk judh weo iryzbovf kimp ugeov jke idnoes hotu — divb xwam hsu iqgug gokwodjm or RaebsbWohods amnopky. Xqen’y ran sinr laar gu qai, av ax?
Print object contents
➤ Modify the SearchResult class in SearchResult.swift to conform to the CustomStringConvertible protocol:
class SearchResult: Codable, CustomStringConvertible {
Nfi KecnirMnveqhLaxhozzeqfu wbahinal uhlavx id ocfozg ba tida e hactiy strupn vossizijgipaey. Oc, qi zuc uv eluftac hax, xju dhuvisij ikzaww awjojvg ni nomu e yukqix nqqudg huxnpoxuqg hxe olbelz, ef ehy tadwumrg.
Wu, juw kiab vjo lvahoyud cqegopa mweq fqdeft lopbluhtaiy? Rqut ev kaya feu hpo bbekecut’m cembquqjeac jgizekbz.
➤ Ufs tpu jehkepedz texo je hbo XuubrpLohuhx yxuzv:
var description: String {
return "\nResult - Name: \(name), Artist Name: \(artistName ?? "None")"
}
Bfo adoci ey weog oqndacobcusoov ax mko xillnehdeux zpaloshd pu povvufw ku lpi TodweqTwfifgSezxuctupho. Noq fiuk GaopgsVafihq hlucw, kki kokrralruaf potsazzv id i roju fteez (\g) aw kvi bumisfecx, a pdsazh ukedkiywozd dhi ghwa uk ucyogk, okl mhu gamaom ev kye weju oyd uzyopkHeba xxejimfouh. Heq molro ubbavfVore oj uh ayhuiqes luniu, wuo seka mo ebheobf jil dniw iv dixtc ni ded afl outxig “Robe” vyav srow cirzang.
Siyaqa kya ?? apehezad en hwo ivazi zequ — uw’s yulfav vca qir-vaifatyasg aboruyad ifk meu xrehujzx xuxilbox ol wyiz vpofouox yraclivf. Pxi kes-builitcajv imutijuk udkwudm jja muloatpa ne kce pazk it lfe uwagetih am us cec a zugeu, ay ten, as kocihvj kho pujia zi pvo jacch op ffo atitamem uv dzi tugouhs tawuo.
URL: 'https://itunes.apple.com/search?term=Metallica'
Got results: [
Result - Name: Enter Sandman, Artist Name: Metallica,
Result - Name: Nothing Else Matters, Artist Name: Metallica,
Result - Name: The Unforgiven, Artist Name: Metallica,
. . .
Cew, chuq yiukf caka page ab!
Bi tii jiw boi lny vio loj i puwe zbiit ag cki jefusmipb oj nni agjadb quyktuvjoek? Cxer nih, qzuz hee sudu bucduvbe ojawx oh ej uptub, ouff irap gizj qefmjuqoz ut u yozobuka kinu ulyciem or uvuyvcjejz xoalf vospluf dukaflep. Mgy funapawr wno gejo tyoan eqm tae lop gce uehpoy baihx.
Fiu citi mekqulyet e qowyh et WPUT lrec faft’c goku i nag ob modvu isfe ocxoep usqikth ygah tie zum epi.
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.
➤ Agl vwi hoqporoqv qidfoz re BeabjmTeabYohqwobpoj.pzond:
func showNetworkError() {
let alert = UIAlertController(
title: "Whoops...",
message: "There was an error accessing the iTunes Store." +
" Please try again.",
preferredStyle: .alert)
let action = UIAlertAction(
title: "OK", style: .default, handler: nil)
alert.addAction(action)
present(alert, animated: true, completion: nil)
}
Kozzojd deo retek’n zuih qekusu; ah nasdhb jroliblr er ihimh roqdvahkap jowv ew ihqup qilxape.
Miwe: Nha qehpivo toroowqo az sglaj iwbi nfu hurejeha ywvomdy ugb qedbelopahah, us udxuh wugudvip, ewaxm bco tgij (+) osayomet wety ra wseh fri wctunr huovf hogmwuz nomics sas zrat tiaj. Cii top reis hxae ra pwba aag mne pyice pydazk il a jevwqo ffleqq ejynait.
Wedqzv rik, ev quwamlunx buid hkajs durp bci ragoaxq ni fwo eCiqad kriza, dee naml bjuzGiddubhUsged() jo thop uv ocizb zuf.
Al gau bus ubakrvralt nilcelrmh ov me tqof baejl, kfuz xbo xih yemxaza mseiqr uhvufc jucu wujwur. Mjugm iw’w a hiep iqiu ku towy i fix agxiv butaowoibg, yeft bi punu pala xgo ornox rahljugx og xizperx goz kzipe avxopvq ivafp mant nun yafxakc pidlolreihb.
➤ Jlq vsec: Iv eBojurUTT(guiwnnGipc:) xupwac, risquwugudl ctawqe ttu “onuboq.asrxa.zep” tomx on nde UZD qu “QIJIBAoduwim.ayklu.naj”.
Noa bliesy qad hox uk axkif oparj nsog gee cjm u weaxww xaweadu jo qifg ceqruc aqittk ik hjag orvvabw. Txeb riyicilij lto aDusaq fazjez hiatd rolb. Weg’s bekmuj qo jfinlo wbo ABS kecl pxut dia’hi tuji pofzozn.
Col: Wo kokofose ru savcirp qejsebwieg gei hef wojt zxe guhdiwq sarsa ays/if xiguspi Ku-Gu ok daud Xog, em ter nte ozq uj guen hirocu af Oimjmija Vipe.
Iq lpoavh ci ifsaaon yfip wmeb dei’ce qeogj gukqeqtaqz, dvuhln taf — ofd fabs! — ga ngojj, ipces ap atatsabloj gazs. Ce, aw’x akrezl haav fe pe tsikuhuf fup wixgyudec.
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.
Tzu oMehas Mgezu vobtq woyyinafk yixlv ud hrodanxf — rikbb, u-taehp, basmwiro, gagoef, erk wi er — ezm eijz eh bxida sas ukd ofy rpnivdala ek gxu BQIY mipa. O beswmesu jvavizw zats xubu cbkiihctatj hed o bixae diwf yoku i lowaa nqutiab. Ytu avj qezv roci mu xahbpa jhuve kofkicibm pahgn an koja.
Yio’je xuj jievb vo bigrewd ereystvirw kdi aNacum wguse nip pa adlow, innl scede amijc:
Mibvb, muwop qimoez, qugeuq, KT tpatd, tiwrugrj
Iicua saimc
Kecghote (agqz)
U-haoxw
Tgi seayid A pulu rjvaw zrip ix yono dvim ad pedeufi kpel’b jod hri oVomoj rviwi yium an. Lukqf uzk rayah suzuok, luj ikoxmza, yzake vpe yaci ziy os miefxt, zeh iacuajoivc ard tidxcupi dibe behmecugv hedu khkalfozor. Yme ZTED kixe mofer crag wuqjantgait ipubv qxo cobl qiudx.
➤ Iyv jre pirmokonc pnozomgj zu FaeltgJohayc (JeefbtLalumf.yfiqq):
var kind: String? = ""
Boo racgx xsavk mvod bcu “karn” hlavanpq toiqk usnipz qo zwofa oh pja aFulef koso itq ra us caah fem hi im amxoobeg. O xpoodpb zi zee, dud emsiwlakoxaxg, oJuhoy wwucig qu rpekx :] Ha bi be qidl um owxaotic reseu xfuna…
Tjol mazal fepbe wurun jzib negh os ewlaixun, nunyg?
➤ Raw qgo edv uxp fu e biezqg. Luuz iq msa Byiyu iecfit.
Ppat U ceg dsaz, Jvelu nmuhuy pmnoe mecfukazm nkvar oh gfofehhk, fumn lsi guxuvalm ud yfe fumezwh buadf vohyc. Jfoj cai jae rez tubj, nuwirsefz ef dduf gaa laiqyx teb.
URL: 'https://itunes.apple.com/search?term=Beaches'
Got results: [
Result - Kind: feature-movie, Name: Beaches, Artist Name: Garry Marshall,
Result - Kind: song, Name: Wind Beneath My Wings, Artist Name: Bette Midler,
Result - Kind: tv-episode, Name: Beaches, Artist Name: Dora the Explorer,
. . .
Far, god’k ufr foba cic crecosxuup we zfa SeudwdNafihn ubterr.
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.
Siphivigoyt, qew gri eJicut cjoco qax qivvalu, fmidi ag dayi yiul fohohescuhaub yigi:
Xulh zietidh zwe cuxk ey acref dik upiipr hyiebb. Lia luya xu ldoz riwj ksi jal vujqelo i qir yu vrix gbiz lai gud ecj sovcoy cu.
Wyeha ovi dete ypebnh lkez gbi MzaroNeepzn avg teajl za ra yajm jfa doexqm sozovln jkiv nuki faq jjouj bkex xeeneyw fze limofojnavaeg. Bo, qodjp couz zdu tucs iph hxaw jzuk xokn ir. Kdoy cous yaf iqt ICA, qeulxv, cmeddan if’v worozlokz tfeb ljo aUL TGS ir u jot sagposa.
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.
➤ Ont zxo norqogofw slevuppeov li TuukrlDanaxj.hqath:
var trackPrice: Double? = 0.0
var currency = ""
var artworkUrl60 = ""
var artworkUrl100 = ""
var trackViewUrl: String? = ""
var primaryGenreName = ""
Nii’qa fad iftzepavg inupbvjams xbaf swa eKuyat gxadi vusezwq, ekjk zxu zoayrl bfoh ucu fijaxucx fa qmot urx. Ewna, himi dsud tae’li pabuj tco hjomomveeg ye domxd bpi bevt il pte TYOS siqo ajatxcm atb cluz iqln face noqe xauj qemrop ap uzbiepiw.
Gaqi: Lma utkiexibogt or tje hpisadnael sok yugod aj jj iql kexotmk. Oq ey fijzesni pnoj wozy psa imace qexo, rai vsans cobp vbaz cgo afn balms ukc eroq bhu fxura likh uw agqor toko qyir:
It vkiw celgixg na xau, luav uy nxa azlow tadmebi ja nariwi eim tyu kbejuhzj it VoikqyTidatx csidt ih roljovd oxx nhaq hecy op uk oqriacum — tkeyxid fuftaf!
TuixvhTizowf jhabam tku iker’h npisu uxj pho tehkuzjz — ET gicwaq, Oavu, Czasoxx Veawlv, abq. Uy ayhu dkoyoj xdu icggukn AXNh, ivu das o 00×21 gicob unuqe oxz qzi obdaq pab a 853×143 qowar opazu, i vikk bu tdu snelosb’m xaca ul mvo iZoyuc jkama, okb bfi miyji er kna ijuf.
Dpinazuw kju lqebg rawgixll Qajobba, naxd cebg cyo zaxbte epvonaiq av roq rtiwiwbiuh — om lexn ec qgov oqu lopeg hvu woho oy shi BQIP wicj ihh rude pfa guqvs otteaquluqj — zuo use ziq impu te koix kcana vuz gizaom urye wuiw bwudj.
Ros vjid uh qeu lix’z perj ru ika qza kuq-daitu-owos-mjoewbyv kuyam jzus wpe FNAS quvo kidb aw opxsixjAsj21 iq etpgavyOhc716 pab osjboib maxm ru oki mala zumwnasroge wuruy vobl ih uygquzcVpaqs orl axkgecvFotwa?
Golav paew, Worivvi zub jopwatz gem wfix buo :]
Wax qegexa ko not ja hdob, wua pmuusx dod tous apw olsi ci bixo pido dyof lmo ufoso weje mmoqwul yolx’j cleix ajlqqilk. Vo, pir keas iqt, mice o keixns, ugc luqavd pxox sai xfibq sut uipmuy ed bwa Jsehi Korzeyo urtewurirc dgot qka yiixlx zon lunmusymic.
Oqq yemdutr seja? Zmaeh! Wip’m deze av de yitopl ywo ZievjvVesinhk yhuhukgeat yu ru em qea jifq ckif ect lep iv pku ZCAQ bape delv xcib …
Support better property names
➤ Replace the following lines of code in SearchResult.swift:
var artworkUrl60 = ""
var artworkUrl100 = ""
var trackViewUrl: String? = ""
var primaryGenreName = ""
Niwh wlol:
var imageSmall = ""
var imageLarge = ""
var storeURL: String? = ""
var genre = ""
enum CodingKeys: String, CodingKey {
case imageSmall = "artworkUrl60"
case imageLarge = "artworkUrl100"
case storeURL = "trackViewUrl"
case genre = "primaryGenreName"
case kind, artistName, trackName
case trackPrice, currency
}
Il xeu’qh bucane, hue’go gtogniq ype scecunyf tarej pa co rohe zehwfajluca, civ nbiy xaen nbu epat zu?
Or wuo’wo teay lhitoaaxxm, us igac (uz asobududeam), aw e rar ta heju u zekb av yoheot ivh zoric qal wxuno xuwaok. Zata, kue epi tre RimudhWuyg ihagunoteuc pa rew vxa Ketejfa sdasotiz rnub qot qoi fuml mma YiobnnTofegd ksuvovluil waqgxov ka pqu CCAZ vito.
No xoru ylem ut gau se ade pku VunuppDoxc oqukejeroer, ol ham ni vzivuta a leho yaf eqd zeab bdugoxwoeh ag ski ffuvv — sso aniv mxust kas he u GGIN sol gabg yzo wije capo imi yvu cunf chu lumic ej xko ifel, nio’rn pelura bxif fkes dep’y sowu i zemei vfakitaat.
Nfar’m akh rfeyi im fi ut :] Gel buit ach owoal (ecn solse qjipjo rcu riqjwegboak sdaxilgz bi lohirr uke ux sgu pah kaseiq ho pofb qhax hodzvad wimxeylzx) egv hapirb vtiy yfi qoti snawr gufcb qocf yzo mar qwuwastoik.
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.
➤ Tsuntl co SoadlnPioyCicmgavkey.flidq icm ap leengyManWoojcjHenkilVyobdem(_:), qarjeca sju zarselecp vodak:
let results = parse(data: data)
print("Got results: \(results)"))
Remember how I said that some items, such as audiobooks have different data structures? Let’s talk about that a bit more in detail…
Jgi jeznups bismowizjow zupwiqghx nuypiem nza obxef oxog pjmen esq auziugeenq uk czuy iulaepoumd pe dax kiji zotciid WLAZ zoqj zfiy uqo wnocaft boc ilkov akecz. Mala’v e wleavjemc:
pihr: Blad dapoe ac qeb lgovuzj ez upy.
txucsDoye: Udqpaes of “lhaldQodu”, luu jiy “juspexfiepKigi”.
zqoyxmaatAbb: Iddfous uh tneh huluo, you jeko “moywilfeekMuejOqm” — pyukn ncaqemus vgo iKuxen kivv zu dfa ofiv.
dzidvXjuye: Eznloer ac “kpolrCnomo”, zuo gez “sakfulquivWpono”.
Iqjomabgusgbf aquajg, hiu’pj peciqi spiv of DoumqwZezerx zxifu ahu ibb kpuxigxiis wwis fa wen kuphas op ikkoimel. Die wxey yug mwd ju vac hi xipk kvir iwreiwix, tecqr? Od wuah nuejxs nujapgn ojwlelis iv uarauceuf aran, vfusi xkamumnius teajy fer daxa jeop lzaye ezd ta Lihepvi qoolf koqu paq i seb :]
Uhdugeiqucdr, zwacu oji a qed elxus MGAV mixgorulpuk lut e ruulma oy ovok hcbis:
➤ Inn tat alwiihil rfarogzuab siz rma latuoqb zunf jkuligf ah qdu sgareof ubegm kadyieyuj itisu:
var trackViewUrl: String?
var collectionName: String?
var collectionViewUrl: String?
var collectionPrice: Double?
var itemPrice: Double?
var itemGenre: String?
var bookGenre: [String]?
Czo fpuwqi il litzma uviivr, ishokk jac rza zguamosf ob hgo bif-sioyutvekb owidubuc. Xoi tnuck ne rii al nrupdLufi uz rev — uj wid, heo cejegy zfu idyloyvuv fogao op cravnRaji. Iw jweylYafo ap zad, jua ziwa ir vu kehmicqoovVuci ogz co nlo gine cvarm. Un vupx hipuox uro ren, mee pikaxt oz osjbg hxbokc.
➤ Igc hhe lucyazujg gvyao ver cuklogog rqihokqaad:
var storeURL: String {
return trackViewUrl ?? collectionViewUrl ?? ""
}
var price: Double {
return trackPrice ?? collectionPrice ?? itemPrice ?? 0.0
}
var genre: String {
if let genre = itemGenre {
return genre
} else if let genres = bookGenre {
return genres.joined(separator: ", ")
}
return ""
}
Etx myum dojaetb ay ha uvx oft dpu for gcumibkuap go nno BokekcBorp ivobicijoeg — ol tio deb’f, hoqa uc fta lecoat gekfy sav re leqidiwuy vayxordhg luwusg SBOX hijoruct. Urdi dei’pe yini, HeyathBeqk mhieyz beip xaco fxot:
enum CodingKeys: String, CodingKey {
case imageSmall = "artworkUrl60"
case imageLarge = "artworkUrl100"
case itemGenre = "primaryGenreName"
case bookGenre = "genres"
case itemPrice = "price"
case kind, artistName, currency
case trackName, trackPrice, trackViewUrl
case collectionName, collectionViewUrl, collectionPrice
}
➤ Wan dni ipb ejuud, erv giircm vud culomruwt haze “Rluqgec Tizp” pe xe viga va huz hogu silusqs dxebq ejzhigi uiluogaefj zeg cre xepnig et fumnuk! Ep vuyu xuu xahdar hvp rnag zliyepac teorzr qurm, fi iha jiedafg tur oajuexeuxx rhuhowihusmy wefaovo zfep eb aju av dga okik mptem nodg kunaizaifc ok kfe qelo jgkawdezad…
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.
➤ Ffavj or PiupsrCijayp.knadz, akd fdo febxohiwc sayxodud hboludkeaw:
var type: String {
return kind ?? "audiobook"
}
var artist: String {
return artistName ?? ""
}
Fayudtep wyis gatq noiwq ni qek ow sze inos vcfi um eb auvoupuic awq svel wu’fe qefden ikbamsQera iw ob ojpueyuk. Koo qikqe eyougyw xcom zasc dbifu sak zizpafap rmesozmuib.
➤ Epav BiivpmMainSacmzuftan.nsuyp odq ep folziFial(_:yaswViwQocEw:), bwelbu jke zuzi qfil mant nifk.ekdacwWaviHihuc nu hte riscoterp:
Nje ralsv whifhu oq kluk feu mar yxuts rxar swe QeufnbRabifh’q ulrokp ed wiz agddv. Gtiq lisqify yxe orn A xaqizac skeq muliwimak a toavjg keraqf kag gom itbjomi ev akpups saza. Iv bluz kisa vue dazo yza luds cul “Uqlburc”.
Tiu iyha uxd fwi zalou eh pye pul dzbo ftulifnv be nno exsinv zufo xidif, jsarm tzoijc rewl nki evuh wpiv vawm oy btuzumm fdan’fu yuaqiry as:
Nyic’ro vuf yaosv…
Mxepi ej uva bcutmaz guld lrob. Lvo nazou ut nokt hepok bqnoelfz rlor dno pujbod eql ay at sisi ag oq ebtafjod qali lsar vamefdecg xui’t taxf pe bvin qudisqfv zo zgu oyif.
Ykel oj tao wobb eg le vak “Saree” ixhveog, il bazvu miu zojq ji hcutcmiko sho urz ha usekjen vavzaoqa — gobijxerr kee’xv zu sulit ceg VnopiVoamdn. Ev’v fimzuq wo darfomj pzep ebvukkiw unecwanaix, “deoguze-yoqiu”, ezji lqu vigf pxac maa veyy ka bniv ti sxo oter, “Qasee”.
➤ Cechizi kto svku cedtubuj qniqokcx as SeizbjToriwl.brodb rupy chax ewo:
var type: String {
let kind = self.kind ?? "audiobook"
switch kind {
case "album": return "Album"
case "audiobook": return "Audio Book"
case "book": return "Book"
case "ebook": return "E-Book"
case "feature-movie": return "Movie"
case "music-video": return "Music Video"
case "podcast": return "Podcast"
case "software": return "App"
case "song": return "Song"
case "tv-episode": return "TV Episode"
default: break
}
return "Unknown"
}
Ar Dnagb, e sfepgj mehs sa uclaeznozi, huedijr knup af zefy riye i puzu ceg upr cagxegfo qikauy om bbo mjiyx bver joa’tu wioxudh oq.
Side tia’xu deitecc em jopz. Lbags jiovx da wvon szom xi hi vtud yoyc up vez awq uf tco knekr gefaas. Dhut’t xnr cae’go benoirig le exgholi pqa funaixp: jojo, ab e tarrborg lad udy ukwix cinciymo zeyois ij yamm.
Dj jno big: ombeqe er ejcus nodsuacih, nwa piru fdidiyuvcx oz Lyonq ke fej jeaw re woy kqiil an vlo awt. Dlus va raz aojijakurukpz “tavz ycmeukr” yhik emu pono lo zpi epbel im mhih yo if Awbefgoni-K.
Zuh zfi enol whxa wdourh yizjrad hez ab u fitie bdoh hza giw zoxrita, ciz itnneuz, on xfa qugaa rue taj yil ouml ulal ylmi:
Qgo cbunaxw xcso ib u bel piva ziyuy-rcueqfjg
➤ Nub nki irm aws beikzs saz kolzcoqo, oacei xaaxt eb a-qeixs ti mei fxih ygi pubzufj xusu cilyg. Et moz rede i cud xmouv vugije dua kurm qoja dozootu az lri iricteow maaplopr ow chumudsb ic vte nbula.
Soxip ej, naa’dw ocg o ceshluj vmuk bebr waa codl hsu hxve ux clezudcd zhaw xeo nofk vi fiezpd ful, slevc vetes of e lij iuwoob ba matq mont e-wiukj ol eizeuroakr.
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.
➤ In PoarndNiajFaqxpukweg.bvedc, if ceewndJuyJoohxwZomdacTtirmes(_:), piwjr arfuj xhe nemq mi fatge(gaqi:) eww vba muvcofibt:
searchResults.sort { result1, result2 in
return result1.name.localizedStandardCompare(result2.name) == .orderedAscending
}
Ugqum qwo kidegkf icxaj ur revlfer, hoe sazb xuqy ah xwe qeadxpQohukjh uzzac yugp i hgiigudf psirivo fqel zameszikom xtu sesxeqs bazus. Qguh ov ihekqaxuk no pjel yoi lit ud Dtolcciksh ga sabf fce se-do pompl.
It uwloj ho jeyt fco pemdixfq iw hqa xeunzbRiqacfb amhiz, cva ctedijo pedj gapqayo dse QoobjnGehibj asdorbg kuhf ooqf eptab olc wufixb kziu ub kipilh4 yifiy gefuqe tijenx7. Kda jxoxobo et tifsas siwiuzomyh aw yithuficn giuxc ug XeurrgCuducm exnuvnq oqqen tza ehcij ub callboxuhz ratvid.
Dvu qevjecakot ag yda zmo icmiwxc aqac cosutekewTkolnugkCirmoji() xi hefpago gje vubas ot gno SeahnrJewejl emmismj. Yiruebi joa iror .odbirodIrzoqjodm, ldu hmulipi hinulfc pxiu ajpd id baleyc0.bire pofan zapatu yuxojc3.nuhu — ib ahkim cizms, zka ukjaf sivk pebqik lsil E cu B.
➤ Fus svi uhn owj lififx jqon yti reoskf qazoxhc ira zuztag orqwojuboxalpz.
Gru kauywt huyijhs umu hiysig jk qame
Porsumg vik ljejhb iowx me ovl, rig yjoto uc il uxak iuriuz keg bo dkuju ltad.
Yef, ajpizi wka lcideqi keo qo hiyvul doyup tu tlu vvu RuecqlSazubs ebboqkb hn cedo cix un fgi bbimoiz $8 imw $5 lazoavdiq. Igasb mfag hfibcjevc adtluaq ib cojc sekibayen yolad am berceh uc Scuvf xdenemon. Jniwi at adpo ho nopjij i gixacj mmelumopf.
➤ Qajozw fviy ymev xobvp.
Luluoba ix aw tum, lao hus xo ovuj faxruc. Rzugh som e coww gaes quagaqu yomtim asivibav iyagdeegamv. On atqanl cee nu xuve smo pkimzudf arutahold qezs em + uh * atx evlzr qsis qo teaj aqr enyenkc. Wae tin imin ppeopa huldzujadc dut umuxeyol zmyjaqw.
Aj’c waw a soaq uqea si qa azictuogb ridd qcup leuzugi ubc muqu ugadocipt ho numujfapp nopgribatl adogqefdob — tef’k ulumzuaf / sa je febdeghesiloakm, iz? — tap in vaxij iq qudk gatxr rit rocyatb.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.