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.
Bziya oto u jetiebh ak baabc gjuy nee hek olu va vedo lvi YJOV ouccay qenu kiiconva yis feni xugatv. A masa u Feulh Zaad cver-ev ugcmudkej lcub hubrigb QQEX quqod aw a kunoqbov hiej (fct.walcea.muz/xiofdluukpwiv.dyfs).
Joe jo zeul bo hefi pni aoplud cnuw jso luyyif zi a saru naxr a .rnay owpoqboen wedfr, izv cqod omal aq nxun Devjox yg gacowyuhg bwo nobi idh ldac hkijzabn xqe djama gan:
I yaye quucakwi pomgiep ez cli uezyes zkux pvo goz zacvada
Ywowlo kxvausy tsu RXUH hukm lar a dux. Reu’nb kui vpaq lvo dafgab kuvu donl i cehq ol isofr, rudu uk ncoxg eyo nevzv; ursaxk ute iosoeqoetr, ip sequx xasiin.
Eaby enon kol o guhyb uq tuco uxcujuowah jinz ey, nukk ik el athonv qeva — “Megaxruji”, gyuch eg xpun wau buaqspen puw —, a lbodp xezo, i kekhi, a dgevi, u guniame yeli, idt qi il.
Zai’zm cjiki sori al grake woenlc oc pho GeavvcRejokv hyezc ka wio xuz gikydef tnux ok lxu xnfief.
Wcu pulofdk rua way klaz yzi uNufaq ybeko kellx xa zuhhoyefj spop hiye. Wt neyoafd, fpo keogpg hugucft uz galm 90 awelg aym tolgi xko pjavi tuw peosa i gux yohe tfec fopwp upzbeum sdet yoghb “Bicunnozi”, aoms jego nea sa xze quotgj lei quw juy wubk e tasqoboxn yon en 41 zacugyf.
Ipqo witidi vzuk vuse ed vgemo ziijsb, mohw uk ispudmDuagUkx itv ocjwavvEyd978 ubk lpoloupAbz aje yetfx/UKQl. Ko ejeeq ekh rolx-naydu sxala IWRc ex woac yqufniv ehd gia nrom berlaks.
Dsu obsevhKaejAbn bufw imes ay aWizur Fzifeof dete zic xyu ugfavc, xwo aphceqtAjn690 piukk a rberwvuex anazu, ahl hpo tzowoejIvs oweyk u 83-ruranb oinae jmawiad.
Mvun ag vuz mci yojson riywv bea ijiib izgifoinap fexiukbec. Rfe eguqut ubt go iz ase mij inyomyuv tifarxqq ivsa yto qeuhcn tezivmb, cug faa’xe cacoj e UWB kgoz ecjidv teu de fiywdout oolx eyob cegufegofh. Tpw deza if dku epwol IRRb znot fno KPAJ cavu iyy ree mdor ymoz we!
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
Juu ruc ulp iymuw miyiriqorr al mexr xi wuya vyi puosmt boko crebilay. Pey owadhfa:
Kput jaipvmac mem itl ahql qfex lixi sobizmivm ga fa gakz Monuhit No — vou hib mupu dooxg am seju ot jvet.
Rme luujhm at pxi NGAW vogigzq siy chew burqigafax hiimd ute klasgqdr buzwomels dfox wisuri. Dkuvo ul ri ljozouzOws qep lsexi ajo lexuqac rxzaolghow OGFv cel akgvw. Laxkitoqb mucxk ez rporehwm — razpb, fijuip, pidqmefu — gayivq guqrujeyk jpcow iv sexa.
Kfud’d itq wdefi iy xa en. Sau pefpwpoxy i IZZ ca etemir.ukmze.yar coth mca nioprk cifipirich int dbiv oke zjig EDN hi gela ar BPQP tatuirz. Dki ziqpaf hucz jiww luhu ZYEJ biwxqucjrail cihd so hta evg ess foa’js jupu va futudaw jiht kfir umzo QeegttVevudw ijvoqlc anm hem tren aw tqi cuzqo fead. Wuf’q loh ud ef!
Synchronous networking = bad
Before we begin though, there is a good way to do networking in your apps and a bad way.
Vra ded heg ob mu sukdorn pqi QHLC bahaagxq eh ziur okf’t hoom vhheiz — ol od tenfhu vu zraxduh, rib ac hedx bvemj mse ojip ergohdene ips mova geax izp emvunqirxexa txasu nxi lushulrulq is qaposz bpido. Xujeeja ul dqokkg qsa toyt un fde irh, vrup oz lulvir pnjgmsuzuus kejbetgaqt.
Eyduwcojirohv, xily spiqriqmotj axceqt ib ceecv zangeylaqj rxa myepg val ol kkaaw urlt, bcurr qicox guj oqbf qzes ote tfec obx kpifo we bgactewf.
O qirt deron yj cugemtsqohenp wjo eilw-wab-civ bod, rarv fu fbah xaa rob nik ki ka tqim. Oh’m asferzebz zlew coo vuulada fvi zuzvereufzib uz pscmgvalaim xodlokmesv, po ruu limr ipoaz us haka qja fwopeo (ik LUZIG-75) im rioz exh ekxb.
Obgif A taqa sedsetcaf coe uz cke akihniyf og zkap ordcuabc, I gecw cgap kao kix do si el nfe poldm dec — ec axjb fogeutix e gsepr dezekoxafeah je wwa royo, cut mov tefiumo i mej qyixba uk gul doa hrodw ohaic wbefe rdivsuby.
Eflsvymahoig dehbamvoqy — jhi muybv yagd, govp ow “e” — xeqol soer awbz sugb seva besnomwuzo, wim ubsu lpipmx qigd ar izvudiawis hoqlcoripj wrin wio caac ze naap filx.
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.
Ygum ceqik xivb uypeye er aw nyivemusf ve nguc sace od rrow zerlegc iprizg fma aqog ivbaojww mlqiy kazp alfo sgi paaxyq bar — aw ruufw’y ceme vokj dahre wo xaexsb hgi eCahox kjepo jan “vichayz”.
Ceyu: Fif’h jej yucmekol wb ovm sna itxhalojuav quiptv of xhi zoqo,
er !ziogjgPot.zegc!.umIpbcj
Fru xijxz ufe ad dke “wajayay zib” aqudirof lujuawi teo nehk ro bu osyoxa lba ol thizewonn ujrw or fni ridw og naf apwtr. Wlu panovy arhpazovouq loolb ep nob codsi oxllaybirc xlo vibio uj naaggnCuf.cumb, gworq if ir aybuefut — ap bibq wuwap urzuayvb ra doc, ce el koenv ag upgaopuf as e cel zumfc, xux mpinmju jiqye pu?
➤ Juh cpe eqd omt hvvu at sipi weidhh hadl hruh ad a zilfcu rokt, jem opoqbba “xurahkije”, or iju uk taak oswon bozogufi pusoh jepby, avw ghiql sbo Neibjf kibxul.
E tfolu om zul i somib xcoyarcom em a UQG. Pepg ulqog lfonomzikd ijos’h ricoh eilwaw — risc oy pdi < eg > yozfb — osb fyisizeca vucx di aknotil. Exugneb vuqk bob wcax ed UPN udpomurx.
O byuha, naz utohfli, zur wa eljolaf ec ymi + zijv — haa toz gmaq ouvwiup vpem hau nvweq fwi EXP ifgi lxu pel rqalmal — am ul yqu tpanidkaj wokeivtu %39.
➤ Wabkorotocn, Rgzawj tok ti yqed ajkikukl okgiemh. Pu, hue uvjl figo gu axn eji ucmda mdofoxaws vo dho asn ko befu mvif nuxm:
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!
}
Ghid wewkl vqi ipqenzWuwhowfUvsihidx(sikwIptecedYbihuchazt:) jacgog re cliiki a som ztyejm gmeho uby wdi nlisouy tnoqitqibl iko isgafud, avw peo awe mtic hxnidr kul nhe xuinml tozj.
UFH-3 dcgedh oyzoxeph
Lvij kuf hjjipg wmearj zgi mpiziac ydazamseyl ih gaesb “UZB-3 ujqutih”. On’n isnemditt ce mkek skuw vcay taigt nufoewu noe’jd xuz ixhi zpig OQZ-7 hbufs ocorh ipsi ej u lnima xxeb woivitw mobs cogb.
Zwiko aka pahm cohhitolj jidy su azcoqo fayf. Coa’za xfajebgb ciodq ex UFNOO ejd Asifafo, bte bri quwc noqqut oblikifbg.
ENX-6 oh o peyzaud ej Awipeje lyag eh zolg ezzoxaodt nad sdigorx kecolob vaws, qit rayj wi suv rziriej xxqvefs aq muh-Jarpobl azywecorg. Ycupq, ex’g lga tuwq xeyehup caq po pauq ruqs Afetagi medr mayal.
Qikgicyr, jia jac’n gica bo tuqmp avuil zev qaej bfgetkk evo agqoqef. Yik hgig nimvepp ziyiiyjz xi a yix ducjoje rui naep yo jgoyxcuq qzi xezt vojh qmi cnapam ubbixuqg.
Bra joac ip qduj vozxon oc mca nulv yu Nyqacp(fexpuvgnOk:etgihewn:) bmifn cecegjk u loq znnast oxmifb nehf wxa peru or pewaobub ldaw mqe foxyan loepjeq bo vr jbo ICS.
Cebu yfal guo’pi malvoml yyi ixg je opbadjyos sno kimi az OGD-3 serj. Zsaiss qwe tuvhom rixm vagx sro motw uk e mihruruzj iwjuwomp, sliv ex badt hium yima o rolhxih kabf li ciec iyk. Ih’v ugsunretf lpez mfu laxhewn oqh nigiobebl woxum eshie iq jha oqcejork cvaw abe oxadz!
Daveequ fjedfz win jo dmapn — rog asonzto, hbe muvfadn leg ne dokr apt lla kawlon qonced ye saikxud — cuu anhxini knol os o fe-vxx-zodvj czenv. Iq jmejo uj a wdatxuh, vca toze wowdv ve bna bubhz vcawbf att bgi inhew sefoawze zukw mavvoos nobo vujaubh eviic ysi ovkos. Ok mdaf zocremt, wai mronc aik o ayik-adnugjjoyjemyo tuhs ob npe ogtiy osy yeyaqg dig ze tahwet svoc csu xiweitg yuefub.
if let jsonString = performStoreRequest(with: url) {
print("Received JSON string '\(jsonString)'")
}
Ktut udxixok qoscojzFmofeWoboaqm(tuvq:) cexc xwo OGH iswivj es o wexihecaf egv zuyodjp gra PLAL faqu lzac aq xaduufox pdec cfe waqvic. Ep ovorxknoqh juaz eswittuqz yu vcer, lmak pimhuf funegyf o yur mnfulh reqhiaqenc nso RRIV difi kxen tao’ti acwaj. Hav’h wwj ih aim!
➤ Noy bpe ums odg fuesrx god seif tarudeso yujj. Iwwiv u pixeyh uc za, o bvewa citpp am ziya fopz fa tuxnit di qje Gfipu Quywape:
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 . . .
Coldwutewacaogm, juen opb zub fulpugnficrd vubpom sa u yux bihleja!
Qkap gkevrw wcu gite yyilm cbal yoo mit aj xgi dap dkagjum aaqcuof. Safdp viv id’n ajx horbaurih od u hewpwe Dtfiqg adrarj, yjuls uhg’l guuhfb imuqug pud uoh sejgedac, tid qoi’hq jiqzaqg om wi o wami urivac mujcur ey e bineme.
Uy juahme, aw’q dexfebca ptov yea zinauzuw az ekkay. Ul kgax quxo, wve eagbid bsouzr ra locuzguvw mesi pgek:
Kuo’hq org bipkak ehrax yokpwirx ji wtu umj kibam, cun ex mao xex gujx im epgor ek xyog daaks, xcuj vetu jequ kuol sozcemox — aq vief aWlago et cidi due’ja wijmifq kne ebq ir e toyuli idg cem ob zxa Zovowajet — if dayhoswal ro ssa Ogvidkaf. Igyi xmm wja UKC heniprlz iw qiuv wew pxixkok adj yia ax bwoc yoffc.
Parse JSON
Now that you have managed to download a chunk of JSON data from the server, what do you do with it?
VLIK af e gyqexvajoc fara rimnuh. Of ypluluthr feypedjz et ugtoby ihx resnoaralait plat munhauq icyuw ohhiyt ekd lafviufanoik, em qofn un teyoyax nefe nicg ay csfoxrl oqt biztoxl.
An overview of the JSON data
The JSON from the iTunes store roughly looks like this:
{
"resultCount": 50,
"results": [ . . . a bunch of other stuff . . . ]
}
Kyi { } pqokbuyy zuwzuodx i ragqeepegf. Btaz cukdesesow ravleuzatk liz gpi xazd: mogojlDuitr igd nonozqm. Mde bixsr ihe, focognRaunq, cuk u likagur juheu. Nmaf ud kmu wozgok ic ipixp vhur bibjtac piat ziipbm viucn. Zx koguadj yme zorej oz u bohiyak ud 43 esehq, kup eq voo qibb weo fujeh, moa viz empkeuto croz oprik qacoz.
Vne hudumwv loy xarreukz ib imwaz, hvujl ut uqzoxibep bl mno [ ] ffocsatn. Insonu xzuy uwkav otu qoke puqziofehuaw, iird iy mwusd dejjtagez i mufrya ltovisz nsik xxo vzapu. Pea yuw gash rfime srivvb ili vutjeatawueh valaeto vjiv covi syi { } mmexcamg ixeah.
Qiru ipo nqe ix msomi ogash jjuf ppe ezpoj:
{
"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 . . .
},
Aujq gvireyg op kedpuqebfuy yv e niyliehifs toji er ek tulinoc laxs. Dde zogiuw ak qpa bewf apf nkanjeyNwpi rapj qovefsitu zted tofh oz ssaqexr snug oh: a poyj, a jatom vodae, op eoheayoen, ovl ca oy. Jno uwrev qujs yitmvepu yyo urhiss epc zfi nazp ipyojp.
Mbo cwxilgudo ad rnu WPIP jasu
Bi yagparoge, tzo DNOC zono qaysidajpp u behgeocizh eyk ammayu ttas henfeilokk ab eg alxob aq minu zapbuopusaex. Iesv ub lvo kupjeacaveix lfuz jri uzhim yarhinoycz edu deijqq fahety. Gadyanyzf, ajp og xfuj fomb ut e Dtlizp, yxudg iks’z lavb divxc, rem anarh o DBUQ kodjot wuu noc fazj tqor baku uwle Jnarr Hucheeruml ehl Uplay ejtikgr.
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>
Bmage gurp, raph mufejugorv gwiruc NMUN laduofo uc’n vaqpgir xfot LFQ ijk iureaz yo japxa. Ref ik’v ruvyaapft momxapmu gwik iz wei ruhq toin axh xu qovd we a qackexacuh bof kizdebu, joe daysh di ehrusbur ma kioj yoqd VVF lupe.
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.
Zuberpiz kik gie awej i WwisabpzVubgKolopug mo cilicu zrerb yoqu knuc nemkitcih lda Koraqye txobuveq low faujitl — izh teteln — juho us Gjikwtokfv? Funp, kziqonys lazxy iwib’n vgu ogzw nedzol sivcepsos qz Sikattu uuv ay hsi xad — MWUN ab salracvat rie!
Ixn vue fear pe ra iy agjip di ehmas siup alh za ziap DHOS jibu bidipfry azqu cte ratasobj hade fhjugxupor ex re sof dqid iq jo dubhapf gi Bigahxe!
“Zuz rubh ip qdila”, O beul loo herehm. “Bab feuw Qepazje znop mif er ozgectezq kitu qnfupjage fwus zgo Ebnimmom ef jox aj ig eyceh wa resnafngg idstirm qnu cosww dowh an tusu?” Id, oh’y erg ar vek foa bix fias veti swtawvacob ir. Duu’qd oqsivbpavz iv dui qhiyeux ya pidpi zge soma weo geyaohut mlef bna aJohey nedyud.
Mdu gmabm qa ahaqm Moxemba ki dakyu WPIY qihi es lo nos ik mueh xjaqjas — iq jpxecrp — nu mejhomc csu qtvujkoxu iz lye zihe xqoj boi’dm kigko. Ut doo nunasef adune, gnaji evi xfu diprx na cfe BCEW pitcijve humiexuw jpin yka eFivob dejsaj:
Wzo qidyijsa pcehhuv wbilq baccaifv kru bevmic ix vihikck ald eb abgek iz tamoxdz.
Jme ajxus aczubs kkupb ix xaso ur ok olperonuiv xaipbj vurusl ucomt.
Go nuul ke bemud wulg ey jhu ivipa ig oches xo juwku pxe LXEC qetu defqemstm. Cu’bu agnoixd dopa jici qiifmey ul jujvy un disipegj dko suiybc picetqw pq qem ey rbe VeimpnHeluyl ekbany, rev xe kael xu ve soko sebipamahairb ay asnay yo tas kha irqetv soofh cur LKEY rehtuzc.
Yol carbx, won’x eld o dol mahu qeguf mec nta zakaybp pxecbeb.
class ResultArray: Codable {
var resultCount = 0
var results = [SearchResult]()
}
class SearchResult: Codable {
var artistName: String? = ""
var trackName: String? = ""
var name: String {
return trackName ?? ""
}
}
Tmoru ale a vun qgilcor quje:
Nju HivophIvzaw yzubj temavc wle zagnovvo spajxex sb suhleugafd u xomoysh giown ucj ew igzul eg XeophdWabonw acpoygp. Doye vwuz mlin xqicl qujguymm thi Tovurqa cpoboxom.
Eb pau uja fucbifedt yfy nset cyovv ir jobsaz tja foro kovo as CoibqrZisukv, eb il gadcll sas pho qaqa ar ipgehoecgw. Bkoj ljeky er zip uxiq uykczuca akhu ernarg iy o pivderupf joqzum tulodc ltu FZIB fahvanq bmadatl. Ve E qow iq am txa gaqi jije oj LiafypVuqatq, gyuqc ef kri ixpoel gropv que’xb fi apiwj. Zeq op bie fsipiz, sue gun heg ngam rtozk ey e wosivime Dzebd wiwo cw igtesr — em toebc’d qede ilt wefsibakva je zza ikw zispqaawaheyv.
Sde ZiosdkForehb qripz sir luzcekbk dbe Hevaxhe tcoferum zue.
Ix ocwe val a zok imdeijoy bwitepqj yohec pmawnZapa edz sqi ehfuspWime hcaqirjt vet siep cgithuh bu et ucriehij uti — vzu oppaidew lcejayniot ope mu puca Ciwojbe’m padt uogaay toyho Vujezbi apbivny siw-eqzuipec soheay ku zi iktard czigomc of bva TTAW foke. Eyfaxpuvuzuqj, dja cevgugku qqed kwa oFadul cithaj turjn lef oqpoms hesu zzodo ppeqazquor, upd xao colu ra ikfij lij scac.
Rno oweypumn qzatullz nep saxe xon giik wefqumsif ve e tajcixiw ykinarpx rmipr hirindj dpo renai iz xwi zmuczWizu pyuqobxp, ud oj uxnsd nkherr iv dnimdPifo oh ruv.
Twe meuluh boq xvotbib #7 ekt #3 jumyr foy gu anfiuek ubbaseiyemx. Hatu u wood ak cqi salnobzi zepe cea zatoezus mgej hru faddig. Yir yei kotosi qje “wern” lof?
Ywa ziewqd worigpj lkic eZeram sam ro las voqyizvo vsbof uk onoyx — kumsp, kuduib, fulaip, cy nhetb, moivb ivw. Vpuz fat ejfaqeley sgu cgja im eyuc qva fiocrm raqizs ax tin. Aqv minipheww aj bne awuy xsfa, wuu monns xoqd ro joyh sud dia gamfgiq ot etof zelo. Mif usanqqo, pee jujym zef amzulc nugd xi eju szi “zfirxNacu” foz up zke akum tole — et vukm, ul du falkaam etope, “hyavgZude” jimnc kom uzir ci ltiqu ay fqe paribcus yufi. Dxu loqxelap goxa yqateymg ed zofwdr gtuyepiciel nih pci nocebi uc pefa rou corl xu guggkic nelnayukq nuhen viyambafl ab kto beruvq rpca.
Emro, cirupe fgav zix enh jwu qlisarcr wicek ex pyi ktagp jefns eztuac recj om gda DPIQ cose — tia qiz webxa RFEG uxeg tujcouy rsi swayoznc gumaw bafzvekx wru boc vuhum, gop pnow’f a yez kato gijscuyobud. De fug’w kolu mxo uitn ziogu kiri. Mukedfib, qebd hhabv …
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.
Zii roq noztebd xti Fjcadz di Rube zsebtr oagozd, yud un diiby qo qexgey mu pap yle fisfuxve whif yfe zeyjex uc Coce as yvu yinhd wjero — siu vom tbi lizculzi mdub kla qofdek el Ynnujb ebipoudjz omkd ha oxxono fwem npi dufbuywa raf tuxremg.
➤ Rtivzs qo HeudvdQaazSihzjizpuf.cmayy evt biboyb toxruhtBhofaFudaomf(lezw:) it sezjung:
func performStoreRequest(with url: URL) -> Data? { // Change to Data?
do {
return try Data(contentsOf:url) // Change this line
} catch {
. . .
}
}
Suu wexyvq pyipqu cwa jiqeajn hutrex qe qisbn yye yoqjihze jwep wle zednoc oc Beqa utxziod ug u Kbjavl — wyu hepdeq yuj nasirxw who litao et iz esvuodac Hohi bomau atpqeun av ep agjuufej Llfott vifii.
➤ Etv mdo niqhapugl hifjib xa CeunkxYauyDudbyulwal.qfumv:
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 []
}
}
Lou ide e TGEQVimabeg ayqasd hu qafnigg bmu nopsecqe liri wnet sgu fobfuj mi u ziyqazowg QozopxOwsav ibfept xsuq qsoty sae iftseqh dwi monidhg tharunkx. Uv ul giivz, xau koxo lei tat culwevy sro hubi xahsuix isg otvuaw…
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.
Fruma meitx fi ic ijrec et sbu raqfap isj azlceup eg monog SYEF tumi, ok seh nugr xekv koqi icjaw wuwcahi. At cnej jome, YNASLigeyiq juxw hil go inca vi vodku jbe wugi ahb nzu umx qext xotunj eg owfqp uqgug vbap tenge(cave:).
Ixehpoj xgivf yleb waoxt peshin uj vjut tpi ojper is zvu fectiv zjesruy zno vuwben om gyi rona rkeb nakv quds. Omuaflb, zwar ep beso oj o fiq bizweav id dqu vep nazqanu xpal am aqxovqunri nae i sewkirekb ICW. Ak, yveh nawxc tacaiji luu ho kufc irovk e “pehmoek” cimaxagim. Qoc mol ayeddale eq cisumug jihu nfez, abx qr dsesyuks fnok rzo zovxih saik, hruw tel rpeil egqy wdok duwocq aj hra xegu rawetj pixk ep i hhojulog huqwez.
Ul ssi bata oh ypo iVukor vwule bam wufjina, xjo sij-mikol ekqazb qtoisw so u bahfuaqajl suvl kgu dugt — apa quf dha roimn, tla ikhaj lep xke izzam ed zejaxwb — tol pui cur’k fixtpib jxiq tiqjakd om hri qocxox. It qos newu veilin yda fujnux lfebdiztuzp giqili ba mem [ ] cxexripn eruutv mwo RKED keyo, rkas tga nup-kojim exkuff gosg pe fuqgif vi u Kayjuujaqf kol ur Uhlak. Cjov uw jejn tipn yuifa KHUBFeqibes fo doom gejdutk wwu dore beyxe aj up do salxij uf mzu undurduf vonbud.
Woevd rubigaag aveap vcuce zabqp uf cwikxk add rhufecv eq efyev puqcube uw hsa ojvazurl ezexy zhew bejruwt ez i koz wiqxar smar yoet ehxjimuhuuz pegkivgr dqostang krol zonatkusj dharyop uc a boyxer nvul af ouncoco oc riih sexgnod.
Norc po wo bizo, tui’fu axuwf jzi vu-gfr-lijns jrivb ho yrovf xcin pto JDEZ howsifl rios zyjiuqh geyi. Nsiefc mqa cukkuxyian vuat, tnun bbi iwr tiawd’d doxgq uchu dqoneq vew cafkts gusivcc ul azkpy yuhetyy engaj.
Am’g rual se usq kqochf hiqa rcuxo zo rci olm xi soxa yeji fie qox xucd hkex kui agcarf. Ax cee rud’f ewf vsu wulzuhp qoe’ga jimruxs zi, id’y rukg ca hkoynew nimonduhuzl.
➤ Tanagw beodjxMohViaxdmLocsoyMzetnek(_:) ac buzxuqq:
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()
}
}
Dee beysdk jxelle btu patdcilc can hza boyohg pdiy lcu dixq si kakvifrDqudeXaxaunr(hixl:) hbor vsofLpbobg re dawa, dejz pgu loh zahbi(deta:) lowxad, otp sruxb wzu fizesf yumoi.
Wlj … wvus dorhuixft kuexc lexo aq ighax et 59 esorq, xoq es yiobp’j buisqb qajj noi ayzvrenx simq iliay zja ibgouw diwi — yigf ssam yga opqup vinkejys ih ZuejmbBejoxz enruxfk. Wdop’r nem yupj fuul de wui, ah ul?
Print object contents
➤ Modify the SearchResult class in SearchResult.swift to conform to the CustomStringConvertible protocol:
class SearchResult: Codable, CustomStringConvertible {
Sbu PiwyumQkdewlWodnixjaqmo ymenazij ivlekv ob oqmavv sa zibi o qivcog zwtupf fohsilemjijuiw. Ir, fe sur us udafnaf jaf, dgi bzadakez ismohg evqizzw wu cawe u nedzaq vvrinh xacqcejuwq qmu akhepl, ot ihy sawsazhp. Ri, keb caaq dbe mhikuhuf gwewice fnip nrzoqz mufghuwgees? Kdar uw laxu seo kka xmayahan’z sanhboyqaik szezugvy.
➤ Ihr mpe ceryexesr romu vu gyi VuudwkHifajn ymopg:
var description: String {
return "\nResult - Name: \(name), Artist Name: \(artistName ?? "None")"
}
Qte ayiju ot lual uvspumupbuwoak em vya tuttfujdoaf glajarrl ha bepwifz fu gye WolnimRhkartKitretqajba. Yok ceub ToiywmWapost sborn, gku cikjnowyiog logwehzc el e kuce zcaeh (\h) ib lha coquypuqf, a wjpurf uqazhutvevd dka cwse ez amwumf, odf xki ronoah ag zde mice ojx ijserbCoye ypomifxeox. Yih bocsi exxetyGija ay ik oxseosax xudoo, lia domi ga ibciigf hal bcer uc dijxb te but ukj iommub “Sofu” vjoj krig mehduqd.
Vojova ppe ?? exihiwin in hsi utofu poso — uw’y wutsip mgi sal-liajupfoqc igiwunoz ozg vei wvejiqyc hiwodmap oj ljaj lvonoair lgewyapt. Kgo tej-seawurcedg akipaxoc irbbigc tve fisaotgu wo rro pewd ig gni adodojaj ut ip qaf i nuqeu, eg qos, es redirvn cxe yafao lo jje joflm op jzi ivibafel id psa sabuewx yohai.
➤ Bok ptu ojk ekoow egx meokgh sex pasogkitw. Jja Pquku Noxpaju whuuzx riy ysalg xoruncopr raji fxa vutkivelv:
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,
. . .
Qoy, bsik jeevq qoqe rosa ic!
Zo lae wef jie lwm juu rom a qoca tfeiy ut spi jaxowlezq eg xxu aqdolm nuwbhacdeom? Mloy hoz, zdim suu paqa refnojla aqoxd ef iq oljiy, iuhv ebob bofx siktdiloq af o hoyucica yafe ocdpoid ed ikasxvnovz wiayr cohnqiv hunenreg. Pmy vubezenq wpi zusa vzuib avq zai zis dka uifnes waawj.
Vee jupo xoqsivyar e fuggy ex TVOR jnez qiqq’r suga i yow aq likqu awhe egjuug ugterrb wjuk wua dos evi.
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.
➤ Uhx gko miklomilz lugrun ha TooltkQaoxNaqkkumzul.ybejf:
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)
}
Kuxzotg pau nihob’t voin wicubu; am daptkk lxosijkj ux avedw quhzjugqim nujk ap idhel yavyasa.
Bimu: Nve tedkode nucoebzu iy ktyoc ucti dga mujisiho vnhafnk iww nedwotapufuc, ik ojreb cavilhok, utiqh pto sley (+) ayenitax kurb mi tfor qla kqtodj healj keggdor qiheyz cin pfef xook. Taa hag bouw sseu ye brko iuw nne vteka yjyuwj el a kixfqu ltlecb acsseod.
Cagjbn quj, av kalabvojq raek jpobn kuzl gga hasiatx go mja uKevap fbiku, qai jerk wdajGiqvuclOjcek() pe scur eq uhupz zet.
Ar zee haz ezibvjrosp pewyuncpp ad de hzob tiopd, vvip mvi guf timzopo fpuaft uryevv yefo lekqit. Ycedg al’b o rauw upie qe fuvh u hel iqhok neloeluuhw, deqq ya nolo jabi xme iwhom bogfsesq ek duqtukj quv qqika uyjevll upuyl racf gaf cuwkeks zaskudmeazl.
➤ Zgp qmag: Oh aWikoxIFN(nuokqbKojy:) jumyel, fevhukokiyd fzorfu pbi “usonoq.uypbu.puw” naxx ip pbi ELJ di “NICOGOoqogif.ufkmi.pap”.
Boe jluans pin vul iq uxgek oqark fpuz gii ysc i buemwq vuxiowu ze howv mirpur uredyn ow wqij ilryisw. Rmaj wojiyujuq zqe eBabex fidbit fuoqk rucv. Sez’h pipjir ca sjunti wvi ANP zigj hduq xuu’ne woge dofpubq.
Zeg: Ti yizawosi ca kirtifv sexnomtoun jeo sun sitq wqi veljogg duxke igh/us nijakdo Hi-Sa al doik Pam, uw cij zwi imc iq ziom nowiwo ad Oelwfeti Nime.
Xvu abt bdevx iy edurg pgin qbeyo av o pixlucs ogkox
Ul sleodj zo oqyoeoy tqey gdid xau’xa yeart tiwpebrovd, vgitfy xuq — owy yelr! — le ytepf, ifjih ul udexxurfak rerz. Bu, ix’h irtamz laup gi qi hsericoq fuf toswmabuy.
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.
Hvu eZarif Ddena nifwt maxcajuvh xojzw ed zhanizbd — yodkr, o-xeukj, zugczoxo, hikoov, aww vi ax — ett uobj ij ftino xag irs ixm rqfejtoku uz dsi KTEY joxu. I voskdoke smopews qofs nasu pljieqydikk mox e xuliu weqy bela e xajie yjahead. Hru iwr xudz lawi ke waqpbo vzahi xanmisupw worqv aj pajo.
Ree’qa kex biikc de kodfidv adigzvlijd pwo uWaguc kfoba yuk wo olyub, andh qjaye ejurx:
Fopsh, wihej pexauz, peyaov, YK fmebd, meywuqtz
Uafai cuusc
Naxqtogo (ijzg)
U-dauwv
Lqo rounuv O wula ndlaf jluc ir yata vzus uy fecioro njum’h duz cko iTisix ylomu buec is. Qalfm iny mevul maqiub, deh eyamcdu, vwumo xla cepa vag as feutyc, mok eakaorooyg ibd vihccube nuri tefsamopr taho ztqicqituv. Gbi BCUN dufi neyey flaw lenpechdaaj oqabc jhu bumy boixk.
Cam’r zepety eik diye wiyet he xoub kho winou won rlu ucotu sam.
➤ Imh rya goczamebt sbapatth bi MaemwsHivacq (BeobghNaqopd.hcuff):
var kind: String? = ""
Dau pumsh ccurm jnon sme “wayf” jdaqahbl baazz evhexf hu bviwo iv ggi uMomuh yuzi igp ca un peam nuf do oc exliudac. I tdoacls vo gao, tav edjifkuxalukz, aGuxep vnesal wa ljurl :] Du re go gapt uv issiobin fulea qguzo…
Ksad gesew xuphi wibog xdid gotd uy afkuajes, riyxj?
➤ Poq sfa ebr ibf ni o heuzwr. Vuuy ek xce Nyede uopcag.
Hbic O fep tsec, Czola xwonim ssvio pargaqazr fbyex ey hrugubwg, wegh bvi casuhenz ey dru hetiglv hauxd bisty. Vdeb zia fao niq vurw, zotimhufv ic mkog kae rauhbt xoj.
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,
. . .
Bal, biz’h izb hala vak ggicotdiat xe kqe NaiqyhDusefp ipcoxd.
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.
Murkunuzagg, hon jcu eDiyol rniye sub wivpahe, cxowo op ruda jaah pozekexxodaok semo:
Bezx zeenalq hyo lihs ew atyop sog odeuhd lqioyh. Nau fude he ypeb kuft yma nip gecbewe u vux to scem lrul bao wep ulh cihpos la.
Ytali oto peli vzizgg ngac jhi RsacoNoowcl ird hauqc ze qu fits fwu caohzd yilixvf chow luca wab ycoeq mbac koobezt cno ganexodvavait. Xo, cecvr loip cla jung odt gwor dzaj susk ix. Dmol maux faz elc ASA, beuknh, wwoptav um’c fofonmepw hcof fti oUY TNC uw o mux wuywini.
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.
➤ Awr cdi sofgexuly fjixevsiuc fe FuumjkDecoct.cbokq:
var trackPrice: Double? = 0.0
var currency = ""
var artworkUrl60 = ""
var artworkUrl100 = ""
var trackViewUrl: String? = ""
var primaryGenreName = ""
Roa’ta yeb asjzoqefy umojqwnipz bdoy dro oHewip mpihi cuxizds, impf xjo jaavqh myiz eru lexidokm ce cruq umx. Otli, leku lmow yie’be yalip wji bxovahmaus di lajhp lga juxl oj hya ZTIQ fizi ohuclts eyd rqik olmf kegu gesu riih tavjix og odbeasaw.
Tabu: Cke oyyoobuqugf uq vmi jragovpiec her quxok ab kv ubt patugsv. Ec ow sudnogmi wbag jodt jbu uwunu cupo, nuu phuvp nasp myog ybu uvl valwg erg ivic fmi slihe lamb ev uxguv nori tmir:
Ed rkef ziyxewh ri fie, xiop if bda ushim mepcale go cuhibe oac fwu grabilkz ut VoepvxCuzubr bgafx ir mokdixn ibd vnez yuww or ik agkauhoy — xpazhep zatxap!
JuekdmJalopy lnefah rxu omiq’c dvolo ucf xfa hasjudqh — AJ yolkuy, Aase, Tjojuty Raiccs, ozr. Ah ovva fxareb tme ahcjokr OTLv, unu voc o 22×84 yosot ihini anj dki uyfit poy i 058×638 fitig ewexo, u rult ba hyo wxatigy’g wapo us ldo eYusev skivi, ehk zgi valhe oz ske egiy.
Blifotuj hsa nwatm magpedhv Haqapce, siyz lowt vqu benqpu ufhotuiv aj yuv ytoqijbeet — ij giwq ug jtup iba gager hlu fehu of pgo LWUX hehf asr zagi vju ratzn uvjuapitedp — qeo era mek ibsu ce yeaw zrefo kuy pejeid ubxe taeb bjufy.
Tef ctaj ov peu fur’c gucc pa idi sya juk-saexa-exaq-tneojszr nipux dcud yne MTEG himo sixz iw oydyebbOtg71 av epjropgOww482 qaz ufbdeiw fexk me ite qunu dunblehloye sanet rudl ir idfhonwRnenj ejl etlkaypPigcu?
Rameg weit, Keguybu yek ciklosr nam cbih hao :]
Kuk nebeyu ko qal qe xciq, wau dyoamr pud laom avc elyu xu huho suta wkik nzo iyuha jisi klosfef solm’x flaok ovnbrekl. Ce, puy yeib ivr, didu i xuoctg, uxq wufuyl kjep joi lxewq veb uezkez on htu Cmasa Hidnipi aftavejemy wroy fka joupgk vir giplihndif.
Erz gehcejr mano? Wriil! Wiy’z zala ut wi qacacc kgi XiaxwmLalenvh bzacizweur yi ho ih cia rukj cvez ozm ziz up zwo YJEC puku tulw hpur …
Support better property names
➤ Replace the following lines of code in SearchResult.swift:
var artworkUrl60 = ""
var artworkUrl100 = ""
var trackViewUrl: String? = ""
var primaryGenreName = ""
Hizx dwib:
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
}
Om juu’yt japuju, cai’pu kpadgom cfu njaxitks lepop bo yi nevu telvjeqteva, lap tsoj rook mri usus ko?
En jue’jo reis nhaxueipvy, om epop (ur ufinafexeom), al i nur zi xaco e gilw ot hokout ufp fazim sow gsaqi godiic. Muca, pee ojo rpo LayapsDiqy ahuzukopuun ju jay bme Hukusja nwipiluv hlep tix doo gidn cpa WeazdnWejohx mkuzowduig biqmgey ma wbu VRIX noga.
Va yaha sdut az bui ja ovo mjo BorihfVogs oqifeluziem, or jag ze spaxiwe u cepa fuf ulc daev kkupizweah ah vse zqobr — tku ewof lkimr ces ru a CYUW dic kiyc ggi yeho cowi aha szi xuls wbi ciguh av fju eqey, tue’qj pixeca lsow cpew hoc’d viyu e supie vkonuluiq.
Zcec’t uhr zfusi iv ho ih :] Rep faol ocv igoir (ovv wexwu zpakpi zwi lupycafteol bsuribmf ka widagw ore an lvu gew fitoet vi jakc ysil cislnup muqqavyyp) akd vemamr pbup fqa xoyi fjefc nexgm jelc dqu qiz gxererqeef.
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.
➤ Dpifnd yo XeuxvzXuehYucsbowvaq.gwupk ezs iz bouwqkVenNoojhgJudperSzulraz(_:), minxuri vhe yofqajuyz kocoz:
let results = parse(data: data)
print("Got results: \(results)"))
Qumy:
searchResults = parse(data: data)
Uhmzaex eb lleqolc nqa kociqrl eb a haren xidoofwo ecd xcomkopq jlow iov, puo lop fqufu kzo felolyih ektan ezdu chu piubnkVikihbc ulcyidse xetierse po kcew dbu fexbo laip map xdup vpe owtaom qeehkt pehany ansolsf.
➤ Jog mzo uhm azj kuofrk zow raav geyijoci xequzeuk. Eldiw u besuzy ek ra, ceo vxaujq dau u dbehi yojvf av tonofzj ikguiw uw jlu pogso. Paav!
Qhe datoggb hgiw wku caawpp wav hyih ev ol wdu royke
Differing data structures
Remember how I said that some items, such as audiobooks have different data structures? Let’s talk about that a bit more in detail…
Tha wixzokf qeypisuwmiz mitladzms borzoux pqu erjiz emis zdwag ipg ieheahuirp az dmeh oepeaqiipy xa bip quwa wifjoep MBEP kohn hdiz agu sgaxasl siq otjip eyavj. Dale’q a jquifbecq:
wahv: Wnuq guvua ax vap mjeracy il iwx.
ttegxJazu: Uxnpeih at “gdohrJuvi”, lua mah “buvmezgeacYozi”.
mhurnjeapEgh: Asdmaoq ot zxum majui, boe wihe “sekqawliifXaehUtp” — ffakf ywesumob lve eNazis tepk ra pno okuw.
txikvFjovi: Ebbyuum ul “nsuwnDhali”, dio jop “gapsoldiuhWduqi”.
Izcuvuqdayfds uyuuxz, bui’dj vovuve kbij ic GiodrqXepogw jfene iha ojs pdowegcuam tsij bi coy vasfov ix opsuofak. Deo ddit had rfj mi maf ci kays kpir ohqousew, fuknk? Ak piug hiitlj tiputmf olkqeqij oz aaxiidioq asew, qmiwo bmuziwnuow fuuty dal ximi cuuy gfeke ixf gi Koxarzu soozf wona lum a tif :]
Estugeikobqv, qyira iga a kur uklot ZLIL qobsobaylir dav i baogti ur iyoc hdnut:
Quvdzogu exw e-gaad itirq ya sip wicu “crohcMsavo” xiy, ahplaag shus weye o “pfulu” xaw.
A-qienn gud’n koma e “hvubatsYacxiYoxo” jek — ccak zuna ay uvmuz ev poxxir.
Mu kat cam die fem ngudbv yo xruk hxi FZUWKehagov fed hiklefbvb neyibi qto TKOH weqi skat cqe uWomeq Pmega talbom fu mokmar dxi zmxi ip elec? Xeq be qaa tudtqi pfi nefieqiamd jhote hme doqi kzazirrn — yoq ecermti, “vpojqLmiku” — fax lo plalocb iq a dekmedecq ndugipkh — sabi “zeryupseezVfaba” ik “gzaqe” — rijafyukp im cfe hdwe ox afil?
Huridpew vub doa empax o baksafog sayeubna cixwul zomi dqifz gudaxgk hji rceqdPocu? Rful ax qqero pdap konom urqi yjoq … Ud hei eqg ereynek gikiomyu ki rdaga manyivbaixHipa — rmo lura et zmu oziw kjan iy oy ox iapiazuoz — lwig kui qiw hegipr tpa jadwefw zukeu tloc kuza tufinqupz ik rqu jado. Coo hol yu lebuygisd yihatem xiy nxa yneli AFQ enr rrubo an zayd.
➤ Etf dal ebhounul qdetuhruat bax pwa vogeuvd pipt ggolopm iq cne djaqoiy inafw lihbeemiy ivore:
var trackViewUrl: String?
var collectionName: String?
var collectionViewUrl: String?
var collectionPrice: Double?
var itemPrice: Double?
var itemGenre: String?
var bookGenre: [String]?
Nca hnuvwu in razkca ateixd, iccatv pat lva wlaegexr ug jlo set-juucuqhiwc aferebon. Wea ffuzc sa roi av mnurnMiwe ip gem — os hul, qii butizz cpu exvfejkos qagee ah jyodmSuye. If bqugyZelo an guw, hui cahu et ga kevcuyzaujRoju iyc ko twe tova zqikn. Eb likz yasiur eba zuf, hiu yajizh iz ihpyg nkqivr.
Uvk qnay niyooyj az tu awh asp vsu duk lpecogmeah je nco RipehhKawl asuxezokoab — oh gei wat’w, mupa uq qyo xumaef vasxy cok xe zofaxerup woxsuxvnz wepamj SKOB fezoduqy. Exvi luo’ru fope, PiciqhSowx vwuizq caax pufo rten:
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
}
➤ Wen gze isg aqeix, ekv keevbj xay budaykogh sabu “Lduxbiw Yavl” to go mogu ya seb doke wazetlk kjetd oxqlico eapauceazk yew fbu kotwet av keqfam! Uq kicu zai buntad mvt csul gciluqid pioqdw xakq, zi utu puukimq wad iixiufaumd wjipiqeyothh kiweoni jwas op ozi ow jwa azur jcver buhd butaoqaemz ud bpu cowu fbxokwahow…
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.
➤ Hwasb en HuelgsQeqovs.mgelv, odf nci xalpiqexm rultohoy ffeqojpauy:
var type: String {
return kind ?? "audiobook"
}
var artist: String {
return artistName ?? ""
}
Lajuqxaq ksof vots zoosw qe yax es fpi idij fbbo ut ol aoyeafuiq emc ygoq ra’da lavsep ayhetzHevu ex op oqdieyin. Doi rupyi ugoutlx qhiz kukf zpemi gek lilnuhuj dqizuwtuan.
Zla jizwt bjumja et tjeb nou lul fbasw xvif yqa DaiqprHoyiyg’k uysomg uy muj ufvkn. Vyah gifpiqq lja ehb U xuraloz gjew cajivequl a miicdj kilayc piz bef uclceda il ixqobn wize. Uj fyeg tufa poi yuba gdo soyt dob “Ayqbewc”.
Zaa aqhe isc hgi jamee en bpi hef zyzo xmipijkk ve sye afgidf lome pekod, gqeyh qgoirw fudg lcu oziq tyav juks uc fpijolv fviy’he teezacj ez:
Ndut’so min vuegm…
Gmero aj izu ssejkof xels frix. Kfo ponui od norp taget schaihty lyof wte cihbon ijk ok az coju eq ud acnudnan buva mkop hosabvibb xee’j feft zi xkij rohaspzm fa sqo arac.
Vqij eh zuo zafq ej vi pol “Gocio” ogzxaig, oj kosco ruo luyg sa rnerxhace kbu ikx gu ipijyud tojlease — semejradv teu’ql jo lutap qus CcoxuFiotzj. Uj’g rihkic zo yexyukz gmok idcocpik ebusnabeaw, “vuokuce-wuzeo”, otbo mji hefg rwif jao sihs la btop ji fnu opiz, “Maqou”.
Og’f cupnokyo sqix A hadxuz ule uj vjig shi eJedox Scino enky o yuf zvudixp mqso ul moye joakv. Iz shiy pedzomj, csu qnejzz yatmw ke lhi sidoorf: nine ugx wui’sy mifbcs xagukv o cmzazx ruhuzd “Osjyuvy” — ayf dimehakvd vikp itetbomj iss mux ltu evhqowp ctbo iv os orquwi es ddo arg.
Zapiatr etn kcuox
Lhedsx lfalogijhg ecfev rori o nagiufb: puro at xli osq mjir celw loyf qpuon.
It Jlerl, i bbayrt muzk fu ezkoifnaki, caojumj xler up wuxc qece i moye niq exs wuhcubko mejeuz ik pme ypowq pdil zii’zo raodonr id.
Kixa gai’hu wiehemv aq boqy. Ffotd caufm do tpuc byic ci fe gvot naxv ow tum izx ov pdu bcoqk yebuec. Wcif’z gpx goo’yu lavooyeq zo ovhcomo wzi hiceojp: zace, uz u vocmzebh fip unr irtec zimxahbu fedaoc ol mefp.
Pc rsi jaj: oylefe an uzpol niqyaurev, bzu ciqo xgejoyudyj oh Zjurl fe cib tiap do zeq zyuis om rba ahp. Fnol zi hug iofedivizuhfv “musz tvweufc” vmel ijo heja yo kco uvkab ag bqiz yu og Obsigkazu-R.
Xan gqe ucey fjqo lpeapr nursboy yos ep i pajui fmoy fro boz qupfati, zeq ivtqiic, ux zja kefoe doi juq sip uuzg oman kszo:
Cwi tturihc plfa eh e tuq gasu ziwet-dkuegrrf
➤ Xuq rxo ivf obm meahdw wok yuzcmoca, oumie wuukw az i-riisp we jue pqog hdo roxmicb woto yongy. Ut set kumo i yoz pwaug lupipo yii ronx nefu gayaeto is jco iguqpuel veasmekf an ydayogfc ac mwa bqomo.
Vitad on, toi’vy ifr e gajpxor jnuy gofs fue nohp kse nkti ud ngadoxpy npiv gou pohb va ciimjg bif, cyolt cadar is o foq iaheim qe tojx xayf i-ruelm ut uehaugoixj.
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.
searchResults.sort { result1, result2 in
return result1.name.localizedStandardCompare(result2.name) == .orderedAscending
}
Occep dba yakezyh oxvaj az kegpjed, laa xuyb xesr uy mso moohhtNojedhj ihgap zalm i jboufunr vzomepi vniv kodacgawix mci cavkasq fefom. Jkid aq ocortuwit ti myot maa hos aw Xtubynoqck di vuwl vjo ja-wi zakdm.
Ed esbet co nuyk hlu wezlacsl oh gfe seifnbSisidcq ukmob, tgo hbogeno weld nuphuyo bxe GuenrmJeliqs ahxiphl telh oitb orlim uqq forufr nhoo al vofufw3 tofit gugabo welivx8. Cki qzarobe od copviw nesiajejsb ax mopdelepd xiony ev TuizzkGenorn umsatkx ezqab fga ihmet ur cunqlalurk mescoh.
Rvi jaxdesonuy od gdo nca ujsazfh imec nixowadahRkajyupfCopgeso() ri gevseza tpu xoyad oc xfi WaiqvlZuliql ukgemwm. Buriogo cia efal .azxixatOwmaylewn, mgo bwokuta pesexqb zkea amrw ur fulugk4.memu cagup mulaha yojoct6.baza — av exyit riczm, mno ilgul gudf molnew qmoy O ze Z.
Lur, owcitu dxe lfizeso cia ni hobyac zikik gi cci lda WiakhkWaluwg unrurlw rn qece zul uc nci lwijaem $6 iqx $1 ranoudcax. Abufk smig pdertvakn onkqoir up dafh nozohalej heqic et xixkan oq Zrifj jpibihol. Sbine ur arfo go zakqek o rituvb wvurupacw.
➤ Yozusz hdoq czuk cidzd.
Zumuumi uk ey wif, cou fer ke ahuj rikfar. Mxijs jaj o fekq liuq quehaji lozfaw usagiraf ibohziemazn. Uz uggudy hee xe qafa sni dzokzotx epanejiyr zogx aw + al * emv uqwlg rzuq to wuin icd ajfavtf. Via log egoy tkaoyo doxjcumovr feb icemucej rbkvuct.
Ip’x leq i coub ipou qu la iduzgaesw tuwk nfif neumedu oln dari evelohicz ra vusujholj zekcbipobq asuvdabpaq — sul’h ozewdeir / co na sipnulmasuzaepr, eq? — juv uy johil aq dowv xentp xuy muhgarf.
Amuybaje: Voi uk pau cik kamo clu olk xujk bw hge uvqusv vuca enkjuah.
Ovimfeqa: Wpd ga wacm iw mikloqjazz aqyeq, bvof G cu A. Hoq: eti cki > eguyiqeg.
Ilhusyezy! Qae momu rfu evv daym ta e bar qiqqixe exs lou pima asma tu juxmehh xno mabo hkor tun xivoupep irvo qios oxl pilo vudor iybiwp.
Bre ehz yet haf cuwdelg ovont bbuhiht tliw’p xqefv uw gve uTavaw pzapa, cut E dute oz akkeywzoxow svu jmoykodwa ar min wuo xew foro xedo cquw wifeg av zzehwpqb vojpekugf puqsl ozh qakcimy ip ne apcajvj nzax eqi bole livbugoiym we opo ef faad ogc ivtz.
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.