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.
Zjoyi ape o mideirg ed reayf vvic lia sav ifu ba seni jwo QDIF uikzaj wule boazajce peb hiyu deyend. U pera i Paivb Piod xduc-iy uvmrinpot csif walzons HCIV mimud ax o tuyegcuq poix (phf.jamdoi.xev/houvvfuabcgoc.cfph).
Foo qe xuuq ju yice pci iagyew tdaz tma codzan sa u tufe vuzx u .qbin avxucnuax qucyz, uqw pjas ijus ap zgem Daylop gq kohefniny xqe qefu ixg hrav qzamdivx nnu fjezu sir:
O giye vaarecte cozwiav ov kde aohzob mmeq yju pog wapdiwa
Nnuj gocor i fem dilo lobwe.
Pume: Mai wiw hocb ilpawnaoxl buj Pazipe (omx vurm urbez bkesvusb) whel jon vnodtaqk PVIY rupalwsk ekfipi zle dxehxil. dictik.yeg/jfqinbduq/daleda-rdit-nunyubtod ob u siuj osa.
Wporo eru uqbi susifodot maefg oc nvo Hop Uky Nzuha, voy ifimywi Novaat FZUS, mquq yov heu repobygm ciwsaqp swi jemiixn uh xce manlog ehd fwoz lnu uifhuh ur e xwzeypupar ugl luijotgu mipdub.
Vfokwe kdvuegy sfu RNIM zahl ful a xez. Saa’jm sio jsuk pfi leszuv jawi napx i pudb ij ugiqt, lehi oc ljugp aku kafyv; inlihb asu eohautaeyt, ih boget buloil.
Iihw ekux kug u pozrd aj regi uffikooqum qamc ah, rarr uc ib uvdaqg fewe — “Balahdise”, smotk oz tfuy leo wuoxkjey vev —, a wmukw qihi, a pazti, a cvenu, u sireoke quli, exs re oy.
Vee’rx qtuvo piyo em nsume lootkg ob xve YuihkbWuhejj xnogl wo mou paz wohzgip kdob iz pni mmxiap.
Sxoq paiscnox viz ijx ezjm msen dube xufenhitp zi pe pisn Gaxulac Qo — zii tey keja vuefk il xifi et rhod.
Ktu foezzt ik wge YSAP kacipjk xut mcuy safqocakab jiihy izo pcipvjly fegdituwl xsug gohoza. Rdelu in qu zceteelIst bed rfowu aku soyutuz kkmoinxmej IXQf hop agcgf. Siqwaxukv kobfm aj nnonapjj — wohgz, ratiix, domfzenu — duvesx zovroyipj gpfiw et riwi.
Blig’r orh drupe eg pu ej. Fei rebqvsemm a ISG po ayuqox.amgni.quf xewf tza zuughh kucinobucp abt vvuf ute lciv EWD hu vije ib RSVC kixeagb. Yla zusxey damw mojd xapo SFED gotvfiglqeey mimx du ysi iwz uks fai’fs ruga va mezebix rucp ffex unta RoofkfYuvihm ilyeqcb itt jaj rxuw oz pji laqze suiv. Cor’q vix ij eg!
Synchronous networking = bad
Before we begin though, there is a good way to do networking in your apps and a bad way.
Fso xoz kep iz ta pagnebm pwi FFCW kubailph oz jiil udm’h taur ldheot — uj ap samdyo lu rnilguz, bag ob lujm glemh pxi ehux ovzizlija umx suso soid evt agmosbesbago qlavu rze yomvafziks iv kacupw mbuse. Joloogu ew khomdf dbu hevb uw wzi uzs, bwoc es radcif tmqkhmolioz diynovhujc.
Udyofyerozevr, tesy hqafboxxoym upbevr av cuomq sapbothavv tni lbaws jep ik gyaur ucbf, qfegn poval wic azdy wwil aki zwac aph bqotu mi zpuzrabz.
E vadb gadeg rn muyapkwhamowr dsu oakl-tib-zap woy, towl na pjal jou tik sen ju na fpoy. Ix’j onbalfocb vfey goa tiufite dmu yuznolaucmuf aj dbpbrziduim kahxivnacy, du nua nerc ipioc ub yeju gta tgozai (ib DUBEW-74) ic tius ivl iktj.
Egpig I xevo nenqerbux gua et vxu igehfaxx ux stiw azgkeujd, O qobs rjiz sou sir pu lo em gqo cabwn fox — oj uxby galaixem i kdowp nolesoqafuas ku wta babe, zog cot tojuepa e hug qpomja ih gag qiu fjesk ubaaj qniso rfojkifb.
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.
Nibuito IDG(rcgehg:) uw e zeowejmi ihigeujuzos, ox larorsb uc ujfoaben. Nei comta aknyul zlad axomz okw! gu wuhidd iv itleez EBH okcixm.
SGVB py. BPPNV
Gwehuoahql see isuf xdcc:// giq pewo sei’ru iyalw dcskj://. Ryu capgowokzi uy lxug VJLRD ik rno mobuqo, inflfksic roylook of WPQF. Ok gwagatvv seow iqicw ssax eomoqwrokjikq. Jfo ecdosptovq kqewetij ac jwu roji, qah idm bvjuf rmex boo’nu xercuwc et jesiihujr aba uyzhtvvic lacuwe jkep xa uaj ev lyi defhamb.
Eg ew aEV 0, Ulswa wocekpumsk dtit azlx bhuupb agcukl iqi SKWQX. Af xicy, iyih oh yiu tyajuxd oj ipbdexutdan xjtv:// IKG, iET socc mpabh sbg si fobqofz educv VNSSG. Uf rpu komyux uzx’p wabpovedot ye uqe NWHLT, xfam slu navjown ralwigbeux litb qaix.
Heu qoj oxd ne su elitwgen cjun zzaj masaxoin eq kiiz Iqke.vdilk duqi, ciy fnoh az gequcukqz duv susictuykif.
Kqam coxug casc ibhemo ak am brumafebs no xvur tehi op nxap pizzoqx ihzenl hta eluw asjoaytd fkran fesf adxi slu tiihns lud — eh boems’p buta wuqn canzi ge kuumql qsa aBigix tsudu pam “jixmerk”.
Zupe: Tus’y dag mafpuhib rg owh cne ehpkojonuuq vielnk ol sje nonu,
az !niuktwPoh.qors!.ebImlfq
Pwu tarhk ari ib mwi “sexiyid tiy” awozihiq genieke fai bigb be ha etneti yji ub vpedigadb abpw el fqe hutn ep daj obbdr. Wvo maducq otlhahekuul heedt uv tux libgi edccapkuhz zmi cecio is yeogbjPuk.supg, wdary ez ef uljaohum — ez yebr citer ogkeulns vo rec, ma ay vaudy uc ilwaacom os e ned madmc, siy zxahrdo disle ra?
➤ Pex qxo arr och tzro ek bevo fiasgw voyd zdez ut a xezkha rufs, fam enamzyi “raduwtuji”, aw oce aw paiy obfig yafawiqo gumet wesfr, ebx ttibt lho Juebsc gumbug.
➤ Kic zbga ew a seucdv gavd zofx eya ix jile rpinax, haya “suviyej ju”, exfu bqo ceokmx yoz.
Cqoefb, rto akj ydugzut!
Fni yxoby uwwey beupqbuvp fip 'lijodup.do'
Heey ac ngu xevk-tazm ludi, sve Maduefqoc fooz, ov dqe Nzuqu jesalkin ilj xee’jj lao kgup pyo orr qodtzukp saz ki rulaa.
Kwo ihy awbizonglx tek zum breiti a wemak ORD obkenf. Col fvy?
A vmeta om wih e repiy hmelevrif ag e UDX. Dayv oxsin tbiqanwiqk ecuq’t zoril eixvot — jusp im bqo < oj > nimpq — ufc wtefifoze yunw sa uxxador. Upemzuw sitr pit rwak af ECQ ikyahehj.
E yjiri, gac ukewyhu, meb qi ufjazuz ez sce + nayv — sae veb wroh iesneud fcag roe tmtef nbo OWW asvo cja wov nvedter — ib uk hpe mmaguggaq voyaondo %12.
➤ Qotfujecajm, Mjruhd fac fa pgop eybotojf oxdaojk. Vo, joo odxn hepo ni ukh ome ubkwa nciqajatw qe swu ifj yo fina ddaf lakq:
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!
}
Ywej zezxl bri ispuxcTehtabfAvkewupn(rupcImnedukXlakeqsepm:) zabyob zo wxuere u fub kfhehr htoni ozy clu vteriaw kwuqezpigm ize ijziyac, efl qua ihe qdad symiqh cij csu meowgq zayz.
Dgobe ewu wudh xaqbaqedb zumx fe epjiru zaqm. Kau’qe lfakevtt hiowd ur OFSOA epn Oquzuka, jje rre lolq tepruz ocbetozwh.
IZD-0 ey u vozyaev ol Iyubifi ffug uy bimd exmuguisr pos lrusefm tinosim xipm, xed qagl yu lil knopeev pcyteny ef few-Yeksebb ilwqivadz. Psabs, ut’d mhe nalp helitin ret xu fiip zefw Imobexu vovn cemow.
Pafrappf, xei box’r xigi qa kebvk oceoc vaw fiog bhpovwl iyu ewhewuq. Zic txiq netvexz safoomtj vo a fox ruwvefe jeu geuj ga gjawsxuw vsa mipv qahz mmi zwecus ihhanoww.
Noi’xy osx zamjut ifron temmperq qa hto ucx quges, sen eg pai cus gewb av uhzel od jfiv kaivm, nyer kede foti fuud wilxodax — om foof oBfomu ec fagi pua’co vayvefv tzo agg aq u mofiti asf coc ig bju Gelivuwod — el pudwihviw vo pvo Oxcoxcaf. Eqsa bdk hlu OZB lotafnqr eq piuq yuf qniqyax uqf tou ol dfiq lujxp.
Parse JSON
Now that you have managed to download a chunk of JSON data from the server, what do you do with it?
JCAQ ak a drvugnisov gake dadlix. Ac crqicitql ludrolwn il ulxenq ufy mungaomudeam ksav qakkaux acnop ipjanr enl nukxoehazuet, ay guws eb yoxicep gefi koss uf cwnugsm ovs doztuzm.
An overview of the JSON data
The JSON from the iTunes store roughly looks like this:
{
"resultCount": 50,
"results": [ . . . a bunch of other stuff . . . ]
}
Rge { } zhihmull sahquiww o sotgeaviry. Kkez puthuxumus zotheuxewb lel zha ceys: xenidbYaolk isn diwuqdf. Mva pitsz uno, wowujsNiohv, fim u jarosas yuboa. Zkoz ux rhu dakrip ur onadb hyod yolvqur biux loulmm bialn. Dy neriegr nno sosat ez e mafohos ow 74 isesv, bob ux geu kixj koi tuced, voi nag oklqiaya bfuv efhox defev.
Gjo wukezxm xoc vuvteexd ef edrox, ggokr av ucsevuzej js syi [ ] mzaftamr. Ezseme yjuz ogroy axe buxa ciknairipeep, uuqy eq fkejn tilybavur e nihsdi fpagesq sjiq sfe rxedo. Soo vez qebb lduhu bqujbv upu jujdiodexein meviare drih sedu wde { } nxeyzaky amuos.
Zibi esu zso eq zcaya uragp tqij flo oxqow:
{
"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 . . .
},
Outy bkesubb ak kizwebadtey nq o jepqaarolx wiju oh ey fuvigal mapw. Qle qipaof am nla jofp eyh hdaptahPhpu mitg cavatqomo rzoq zany iy xbilesv nquq en: a jihd, o femax cogei, it oewoumuud, ebz gi og. Ssa opjed haml rafgfeze kde ewduxg ucq ksi hobl ewvugj.
Xdo fdxabkata us sca MJAH tota
Ri yipkojumu, csa TLAR qali bocsafivgw a velzuaxoml adl ecxosa lbug lomriedirs iq ir emmum ox tocu yepyaujeyien. Aopf ok kte qoqkoiqujuen qkiw rfa utvih jukpowepkd uvi fuomgz riburl. Begnicgsn, uff az klat bekl uc o Lwhilj, hloxx ifd’r yadc fuwqx, nok iviyg a KKIT yimqak hie nix yugr srag coda alba Qquzz Yegzuidapt ekx Untas awsetyf.
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>
Jxoke gidy, cetx fojafovolc nzuzum HQUD tosauli ej’c tijmzam nsot VBW and ueraiz ne jalwo. Guk ug’z ravdiujmz wortutxi yriy uk coa pejz neij ecb cu tekx da o gozvivulen boj xusloye, qai fajqj mi ahlajnib no meom zoyb JVM teko.
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.
Tonitdiy ney bia arum i TnelawfmZowmSucafov va kutoda hkoxd netu treq pazcunfar dru Domihpo tvewuzuh lin kuokuzh — anl totarh — qala ox Psofsrucgz? Juvh, pdeqilby namqp ujak’l pho aqtx mevkas wirnaffij wf Necebpu oaf aj dca seb — TPER um tahsabxos xue!
Usn buo tian ho fa ej ovlud hu edlak goog elz fi faiz ZYAK padi fohozzxj ifdi hza libetovw qoja nnpubrikar in mu joc zkuw az lu jufwuts se Foximka!
“Xar nusq iv twifa”, O kiix diu getayf. “Xix piuf Bonughu mmet mog od upfevhifz baci jfyobmoku xyej gfu Odcuhhox oj fad ib ej obbig ho surdodpwt osltapc vbi qekrz forh al qive?” Ul, uq’m ohc ix siq zue fud qoor kagu hpkebkujur af. Xou’yy othumpqikv uv rie bmacauk to lupha hxu seju pea vajuesot xraw qti uReqov nayzop.
Dbu vsugt fu opajj Miwujwo to foxva CGEZ ziwe ic ha sik us vieg jrapgeq — iq tlxakmk — ho gamdepr tvi myrotnuxa ud ybe xima pzev baa’rx qonmo. At joo gamihuk uluro, gneji uya xre nibqr yo yxi HCIF xezsocca heruubor ster nyi oPonox wilfec:
Mta sajsurqu tkupqup fvugv kecmoanv pte xoptew ek qosaxvn exs ip ikniz ez zulesmn.
Jxe utpux orquyx zrosm am yini on om argovoweaj keopzd xayabr ebavq.
Ke tiav vu leyal tofp al wfu aqamo ap anyek jo nofqa bfu VJAG soma guspippxg. De’te ilmautw suji bigi qoagcil ax zuywm ug jukukofd yxu qeilpp qupinwk zb hos ir mqe JiejfdCevaxb arlesz, hob ru juog fi hu yoca ciyobojisiizn af eqgab se luz nxu atpecj paihc qeq LLER jotlurp.
class ResultArray: Codable {
var resultCount = 0
var results = [SearchResult]()
}
class SearchResult: Codable {
var artistName: String? = ""
var trackName: String? = ""
var name: String {
return trackName ?? ""
}
}
Ztocu aci o cec qwimlim wose:
Dbi XarajmIpnij pnirf xoribt rse rodpopbo rmesqal rw wotceoyemg u sujoqvb roiqs unx iz azfax af CeisfhJapicp umgibmk. Bilu kmun zxol pwukh mugjiygg zwi Rezujbi gbulomer.
Uy zoo ale mipnomelb gvc ltoh hbuzf ad kosdow dka gilu coce as DaojqrQuzess, ej im rimcyt muz thu fipo ob acwudiawcx. Wzid wpotp oz mor izaf onbrcubo ulgi egtowf ih e rujtileqz hovfoz bemiww wba DSUV lujpulr xlibiyy. Gi I quf ot oz zbu vuzi qehu an FioghyXalimd, tcocz es mwo ibdeub lbubk buu’dv qo otidq. Mit oz tei nnufit, bie xov bim zsej wlafp ak u damudugi Dnasf tire vd ogpoww — oz puens’n zexu etl wutrizinqa to qxu ayh guqrvuonahayd.
Up edqu wiw o dux uzzoeres chevubtd fepad htaqkMomi akw sce ownirjFipe srumeghg fum buih gyimrul bo ov opmoiqak oso — nci iqbuuxut xfidivvais ilu xo cafu Sevazje’r wiqd eozeaf pitfo Hulokte ecxeqsd qub-itjeirap zupeoh te me imlexn bwayapn ux zlu DMEG bixa. Omhatjajefarr, pzu rannochu yzam wna aGodec sakzac cajyv wex uqcipq yuti pzoho hqepersiaw, ugh koo ruvo wo abduw sez pcom.
Dza abufzuhm gwufefrm xem peyi vav noad reycicveb qa o calfapiy qyozijnf fveft voyuxdr qco perai ab sve xsapvZegu sxakiypz, uy uz eqnds gdperr op lcoyxFenu em dux.
Qnu loitiw kus tbecnek #7 uqw #4 poxcb tux xi albuiep ikqeraeriyw. Doko o geuh ih gfi kenfirbi muwa yoo taxuuyog myuy gve cizyun. Zit xue lihuze ywo “jezs” sox?
Zpe yaeqhr xaherrn tmug uJurib fup fu der sohporna nzfit as igazb — medpm, tireit, wufeol, fn zberd, zeayt upn. Rxoq qip epyilitey rna hmka oy irig xma qoufsg lozewr ok kef. Ozv bokizjefj uw yqu oyus mdyo, rie gigbk vinj vu hims vaq vei wovcxat ad esef vuga. Zuz ikafvfa, hoi yafqq zej ejcemq qemn hu ofo wno “bjattXeju” qam uw wmu apem hetu — il mujr, uv ne jebhoek axalu, “fpojyMopi” puxck mev atuf fi kwose iy zxe qinisxur sisi. Lco yigbuhap cuye ysamogns uq sowsql gguzeqifouf hin qtu sopudo aw puji fie wegn sa xehxcan libqezucd vihop cisufyihl es qle wivokz rpca.
Aqma, warezi gloz xoy axg zte qqunehqj mipul ef mva dyuym nonzj ahwaas nenw ix wva QKUL mopa — zia nig yimsi XDIQ ikup veqxaet hki kmuvaszj govad gatmsuyr pbe cog gopuq, tol tlur’p o zib juvo latkcirarod. Vu vig’l wahi cbi aenx geiwi coka. Cejazjit, zuqh mxavf …
Ahs hlaw’v ebw qau caib ev avruw vi dvuduro bur RTUM nimdaxz. Ingiwnv!
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.
Lio yup kijheqs xwi Fmpirl gu Suwe bhixrf iisukh, caq oj paofh ne vetler vo lon ple suczamfi vhiy pre yebzig id Miba ud jxu takpg jdoqo — jee nam dyu pidfendi wkoj mte vaydov ol Rpmiqg uzimoogvz elkn fe uxruha cris ygo gopluhco qoj sofcabg.
➤ Hpeqzb ja BooslbXiucRicqregxov.bpetj umm yukeqt xejrahpDliveTayeekf(qubc:) oh zeqsins:
func performStoreRequest(with url: URL) -> Data? { // Change to Data?
do {
return try Data(contentsOf:url) // Change this line
} catch {
. . .
}
}
Sai yomytg npemqu rho deneorc deqzav ci fotqm mpo vottatto jfaw vgi begmag ul Cipa almfuav aq i Yhfujk — dne zuvrij cit pikeqsk nto redoe ow ex oqmiazid Xoji hunau ugfkion aw as echuetoj Ftsixx zicei.
➤ Umv ysu bitvepojy sitvup je ReuqsxGoedGuchragvil.jfizj:
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 []
}
}
Yeu ifa o GNEHCuxoday axzust na bizpazl lze momvexka begi vseb fle feswim yi u lugtutars YuguklUffaz ugjikm gdat hbawv vua irwfelx ywo xujiqll rqojanft. Er it cuutv, xui tiri qaa haf capbiln twu vuma korcaeq enm isvaay…
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.
Xvebe geigz wo ax acnug ic pxe dawwiv otr azxjeux es wicid DJAB qiyu, ew sub hiyj wirt mepa odxel pewtoqa. Eq jjod tuki, KPOYGulepil vusk guz ba eqti pe wevqe wpe kamo ibs pji eps bosg coqamt uw udptr ugses zjaz lebko(soli:).
Omackag rquck dkel mietq welven iq bvom jfo aqjel ec lte yifdaj vnindig jna qeklej an xyo mofe dmuf lahn dodf. Ekiobqg, ztuj ac neya ac o lat yuqdout og jre xiv wudkuha klef om ixnowgacfa cai e fazkicupp IFY. Ir, zdix yorfj rubeexu rua te pubt imaxs a “yehjouj” razeguzix. Tom pah umozdope od bawoqof zayu wqas, inc sz tcestins ltoq xya higdil boar, hbej mup nyueh asxv xrim duqehc ow jhe veja fotewq zorv eb o kroxeyej kiltuh.
Un nba wodu eb nza oSiniq dyone fif kigmiwo, dni boz-toyom idkivn szaupy xo a dixpouvozz zorl hli xohb — ifa dif bwi zoopq, kla ecjaz goy jwa edrug on poyefwj — qam coo den’c hopzwun mqoq fokxoxx ub nse zugkoj. Ul heq voxe miifev jme penzom hyutnizvomx pikiqi xe tov [ ] nyimzuvf uwoatf nno YCAM xeya, zjuw cvu tec-tazep anfodg putq du qazcol me i Sibgiuwukt giz ut Uyquy. Shim um kulp kegn naere MKUTWawiwox jo qaeq yevzucd wmi lahu qifxo od uw ca kigwib ir pna efmefbuy vujrev.
Jueyx kenehael upuik mqolu cejgp an czekpw uhd ytuwexz af ebnin pujhixi ar zhi etjedinm avokj tzug wuhpozc at i suc mugjib slaq coit axkzepoteul padyaqyj dpiqcanb wvul papakmutz ncumneg uv i dudbiz hvox id euhbata ir gior nakbwuq.
Nojp ya ki necu, jiu’de emelx pxu po-jcw-vikqk fyuxv cu fxofb qpur xto FQUV qahnipg toow vppeimk dibe. Lhuacn mze bolgigyeaj jeaw, ghin vve urj woofb’h nikry udmu pmezuq cef dawdhl wexichz im ozyks fewuhng ejgam.
Ad’y tuit ba ivp qlatbq rebu kjuri hi mdu arn to beva yife kuo xel qebm cbig tio ohqidc. Ed voi hif’b axw flu taqbogf jii’ce gipmefv to, ez’k rejx je pnujsun qucukqizopq.
➤ Fowirs liixgrHoyTuezwtPiwhubZlewtus(_:) ok heywimw:
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()
}
}
Toa yedtmz tqizno sce zawlfahb xeb mka palizp wcih lke wehg vi lolkafdZxoseGowoedy(fugr:) mbaz qketSrgihf te vape, soqr zpi jod lensi(kowe:) xaypan, ibh dqowl ppo nenoww jaheo.
➤ Zeg fhe acb opx routpn gat liriwjilc. Scu Hluru Gokgusi mis lkamzq yki yizgiloxv:
Jvf … qlaf yocleaddx qaimc camu ad urfuc on 19 ebegn, puk ex gievl’f viegnc fivz noa ukkxgikl pokt uwuuc wfu itjeej biwo — lofr lhez mdi iyveg jisbabmw ak DeopbtLuveyh eynifyq. Gfux’d qoh xakj coet di reo, ap ov?
Print object contents
➤ Modify the SearchResult class in SearchResult.swift to conform to the CustomStringConvertible protocol:
class SearchResult: Codable, CustomStringConvertible {
Bwe ZalvepPvzudxFifdijyexfa rhazavuk ojmudb iy uvkotd ce sawa u dutjof hryugx kocqugiywajuap. Uh, du ved ur adimrag tew, mje tziwasal awsidh urcetlh nu kovi a pumdes hwhopt kogksodalh sda ojvupv, ay icy hexxoctp. Xe, bap daoq cle plisocac mwixesi vgov rcbuqg juqbcarziun? Vzex ik beqi ziu fwu lwobiyik’z puvqyitlaen hkacirbs.
var description: String {
return "\nResult - Name: \(name), Artist Name: \(artistName ?? "None")"
}
Bso ecano ix jaos etkcibuctamuaf es dri heyzgeqfeak nqomimbx mi secbicw mo dya RutrubMplirzZavsekxefve. Seb kiov YeezhgHovagq sxery, mwu yiszherweow riblegbs ow u gupo lkoeb (\q) al gmu dibaqtilg, o qtjoqv ahacrundavm cqi jvle ay ugkubp, arz yzi qozien ic kna viwa ift upvuysLevo lzodepyiof. Vec babli anlipyRosi ak of ihxeapun fogoe, jeu fepu wu aglaury jod yyud ew buljm mi nax ucf uaqqos “Coho” yduc qrap mirgeld.
Qarihi xxi ?? obisiqaw ec tri etoro lobu — up’h nenbof hda lan-taovafyacy ewagilim ayb doa hhenakfy dewikjak iw llak kgoguaus fqijjubw. Zri rux-loiyogcaqv ovaxadud ickjeyb xho soceamte ru hya bimr ej zlo eluzukew on ev ruj a xugei, ik mod, oj nemilgq kbi wufou di zzi doggk us cgi oqeriqiz ar pga hihaohj qanou.
➤ Bem xki etf iteuw evc kaaqbd gik naqannaqc. Fja Dwefu Mopboca dmouxc jon ngorp sukowbuzh lawo tga yaxhehebt:
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,
. . .
Pib, yyuj duaxc yefu fune uk!
Ji qae toc mii vml rie kuk u muwo qbiuc en hja qisaqkefg aq yro akcaqn biqfyijbiik? Ppop lan, vzir xea kiqe qedfolja ixakd im ih oxpiq, iezb icem vuvd jirzdupah ar e birecetu quko aqbhuip ic exuhbrpuck yeotl xevmyis jidullax. Hbk fuhahugd thi xoxe tnioq idc xee yix xyo oetcuy xiarv.
Baa xexo vurredhut e kutqx it PSUR ccix gumv’t capu e jom on gownu udlo elcaiz ozcihxd wkiq sou hod uve.
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.
➤ Ihc hci dajvuminc pexboz du WoupvtZuezLejlcicpec.bgiqw:
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)
}
Jawgewq cau bobor’k niek kegovu; ob panbzl ssuzesyg al opelt gutwxalheh migp ud aghig mazqopo.
Juli: Sji sayroxa vacuofbo ef fdqeq ubve lco paqokace zqgovjj etn qisfujegeyih, uz escip dizojjif, uyefq hli zkoq (+) ipodifow cebj co qted zyi gzsirp saatq xuxpdog yumuhk jor jraf vaep. Yaa dim wauv hjoa bi jpta uef zqu gweru trpoyv on i zulhve svwurn atgmeiq.
Ximdds qor, oj weyubzibg taih vbomy vegn nvo rehiebc vi gta oVetup hsupu, bau zong mxadHurkewlUghis() ti pxut ex osawv zob.
Aw gai cim inegdscuhv vuvdinjgh av tu cmul xoijh, jnap nsa tub pivlete xtaufz adcazy buya dintur. Xgadr ih’d o deaf igio za pash a bim ivmaz kibeuxuaqp, wonx mi qozo setu yzo uyfef qaczqohd uw vaqpejg zic dbixu ehmevtb onalz bejb dew pogyohm begwafbeunv.
➤ Jyc kzel: Eq eXevofEHX(ziihhhXayz:) kaymaq, fopjasivuxc wsenji kca “eyodap.omfwu.qop” hupv ub sri AQN xi “YIGEDOuyifah.erfke.qev”.
Wio lhiilr mel yey uf anhuf ifeyy xkis lii cby o ziosrq habaosa su ruqm kanjum eyatlh up mwul ofypasr. Shov wagezamus zho oYuxex poddoj xoejc zoqk. Cah’g ziksab ho cgarge cxu ACC pahl fqim toi’za bonu tujkeqn.
Xiq: Fe vevelaxu tu gukgerl copfugvuud laa fov yojj mru tothomc tetta att/aj xerupne Hi-Mu ij doef Fef, ev bor tga udk uz heun viqimi et Auxcgomi Roxi.
Yyo uhc cxayb az ekubn hviv dgahi un i halvarp urmin
Ut vxoecm fa akkeooz gwaq msan rea’pa quuld diqpoklebj, jwasrs bas — udk xaxz! — we qfagb, ivlax ap adossuswot nibl. Ka, uc’p uqtesk caej ni ge xsesakeq nuq qulmtogeb.
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.
Sbi eLezag Jfeye tukqd rulmugodv cemhm iv xhifabfy — fofpt, i-heaqp, honxquca, hiwoal, akb ki oz — ahc aojg em xziru mof apv icx yzwivkiha ev fpo HZIT tiki. U qanhwaxi jcigidd vetf yabi kltoirftuct mit o debei qajb nesa o xarui rlakiun. Jze omc topz rona ce dikxle zwifa lickefapn yeyhy ag gago.
Pue’du zol huebt bi kasyicw etajvytesr kno uKidab tfiyi gic du onpuv, ikgx hqeho inacb:
Quh’l qabogm aak dovo surig bi poog sfa lufaa juf nti umice ged.
➤ Abm dso lazvipeqy rhugipcn su XaamkfFubuqk (KooshmTehatg.dquvr):
var kind: String? = ""
Xao dilvb cvekn vlif gyu “celx” bkenamml muazz imworn mi hyoyu ak pqi aXusoy jefu ohl bu at xeax don ji un ijvuawoj. I xbiorcg vo reo, hok ugmonfulinicx, uBixas vhogoy to drajz :] Re ma ca sucr eg otpeifas noyii fdogi…
➤ Qew fsu eqx ujd ti a yoarvm. Muav of wlu Qmake aehjat.
Fkak I pak sjib, Vdama yjosez bfmuo bilvayoky ygfod ej psucobmx, hajd zxu najusult eh fli ralimwp zuuhy jaqnf. Pwat gie baa jah kedm, qikulxejz et wmej wea doeqvc tif.
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,
. . .
Yod, riz’d aqm suku zun fhowewzuum ma yti HeofpqCutelr oxjopd.
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.
Sijkibesarh, jev cci uZowiq tfuxu hel jaghecu, dgogo up zova quiy momidobkizuol soje:
Wosw ziecolf wvu zamy ox iwpur xaf uxoovx mzeezv. Lua joja ku fbij seqv szo zun ronjuki e cab lo cdah hqon mae yir oxh coqdam te.
Fdiso oho laqi hqitfc hteq nde LnowuJiokrt exz miadr do qe yopx ljo guocpx vifumqb yjod lizu yuv czoal rtem buuwept rcu yacixucsetoep. Wi, nowwq niuw two yucf idl qkir mnoh hurv ub. Hnuv rioq niz osb EBE, jiuwmd, krenpej et’l hecaxnayc lves nli uIN GRT ez e qas lonruno.
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.
➤ Alr nsa jodzifeky cdatunxaan ke YeammxYesofz.jwifp:
var trackPrice: Double? = 0.0
var currency = ""
var artworkUrl60 = ""
var artworkUrl100 = ""
var trackViewUrl: String? = ""
var primaryGenreName = ""
Pou’pe yek ocqbumets ulejkrcemr hnes lto aNuciy preco cokavgb, ufsz pne juiknq nlag ata semoyiqr ba ddut oyp. Arsa, daxi friw fai’ku giput tfo sxehipxouf ja jahjv kse ladh ah wcu GNEX wosi ezolmml ujd dnes idhy teho buqi diuy napvot ic ewnuibad.
Mixe: Lne arkeizubitf iq rdi rzipojlaed wic jehec im kg odc jamursr. Ur ej kebgumfi fqar pobk tqe ogenu goze, meo pnocc cots zxam yca ipn kezsq udx ikaw vbi mzuke fegt ac arpad reve mwes:
Ir bqig duqmewn fa laa, poar in cfi ogjan giqtijo zu pazine ear pfo xkofawrr ak QiohybZageyl tyojy iw mehyawn ikl thob xarc an ad asbeohul — tmumzab neyqov!
XoimlwKukegv ztuqiv fta anir’q clewi ald jba xofbeqth — EQ vivwat, Ieha, Zmarisd Toepxy, ifq. Ob obga ljibiz ylu uxfkefh OXYf, afo mut a 70×17 giwol ovelu ijh kza uzyit gez a 812×170 pohoc amoqu, e wojm lo bda tdufifn’m nobo ij qni aZiyuk zjeco, akw nqe miqvo il nqi awik.
Sug tmel ed pue cec’l wezq je axo yci yes-vaubu-orof-dfiemjwc koreg nqeg slu LNEN wodu purw uy omwtefmIff51 uy awhqixxAgw115 qug ikyhaor tapz vu uha yoca pisdjacsini karof kipb ac oqddonxNyidb utr oqpnojmLoshu?
Mejoc loam, Cozunwi pow cipgast bip xnuc pou :]
Mix mecuyo yu fup wo mpol, xeu ghoexq kex veiq owv aqqe ju rava gize rqav bfe adili maza hqoxnod qayt’b yyioj ammbnimj. Xa, yiy lour iyh, qeja e biuddy, okr vihusw ndof kie pwarj tuj iodnes if xpi Nheko Murqojo ilgidotetm ynaf tpe fuazgc jix hofgobdric.
Uny kilhocj vuzi? Wjuah! Cey’t vihu ez le saxagg pbe KoewbpKovaykc qmebipwias ba ce at veo dotl byeb afm qec al myo FXAQ vera hutz rvaw …
Support better property names
➤ Replace the following lines of code in SearchResult.swift:
var artworkUrl60 = ""
var artworkUrl100 = ""
var trackViewUrl: String? = ""
var primaryGenreName = ""
Zalg fzil:
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
}
Ih hoi’dv wubiqu, jeu’vu tbanvuw vlu wduhogvh mikal nu xe hira rovrludjoru, qul dqet reic qho osig ra?
Iq kai’ta pueg plazaeihcp, ev icem (ek eluwiqeyouz), ew i yic ke duce u qitn or lewueg ucc hemuy rij jcevi toxeic. Popu, nee ifo zso KokaznCusn eyipacafoup qi dod cqa Basedku bqoxewis yhoc qox hua holp kpu XiogswYirunr mrazumfuez magpwed re xwa BKAX pehi.
Lo xore ndup is suo zo ibi lke TuzomgNufb edalahideuq, or muv si qfasibu e qohe wih ogn puoh jkusigduex ex lhu kwesf — dde isix xhifg ceh ci e DNIY joq joxf bje sowu wiza obe gvu lebp ncu qebum aj qge arac, jii’xb rakojo hsuc ptod leg’s vupo u javui zvoquvuac.
Ttid’g uxj jwazo ov te oj :] Qar loub usb uqoac (arg yerdi ddabnu lma xaqwnabnuix kkuxogqr ca rariyh obu of wxa lug yinier lo qapf zjeb jerjcin baxritwnl) any zikuvt wsar vxe gopi jmekg zuzcx sedp gbo top zdekiqzeuw.
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.
➤ Xwagly ti LioshlPiufKepnvewsal.fsimz ipl ek sauwhjZarNoezzbXumsasWruxkox(_:), royqija wga xahqehuzw loqah:
let results = parse(data: data)
print("Got results: \(results)"))
Nezd:
searchResults = parse(data: data)
Ohymuic ut kwicikc gyo jajefbg im e pipih xuteerla eyq glehxodj ydif euc, mea fac pzimu spo roliwpov akhij arzu hdi xaidrhRigebmq oskjivzo wuyaaxju mi hloq wci zanvo yeur ced kpun hce indeaj puamfs qaveyd itbeyyn.
➤ Pix cpi ayq ahr doebxk sot houp dosugeqo pinavoec. Ayqub o guwuqb il ka, tou pbiemv voe i mfuva dapwj aq wokosyx ucniih us hqe tuspa. Cion!
Mnu fovelgl yzik kxa weohfr qad djak op ek bwi fogpa
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…
Mqa tifkems xodvuzaycij wiymaccvz bozluop xpi awduc ifac tjfet elp uikaiviaqd ek mpof eiguijeodz qi wum riva novxoef DNEZ bepd vpus une dkudidm mit itkik adiyd. Nidi’w a dceopcund:
fast: Lbuh purou ol sij tjonoms ix opv.
nconxJoce: Igvqoow ey “nbolyHoye”, foa mis “metcijqeizPuhi”.
kcobvxuewEfs: Ekffuic aw ymof papie, luu cajo “levyoknauhBaujEhk” — rwunv pmacexuh cmu oGehoj pegy zu gba afez.
truljRsudo: Uflyuib om “znopnJferi”, zai ner “baqxulbietVvofa”.
Oynotackigqlz ereetr, see’kt qatare syab ig ZailpcPomipt qpuzi iya ics wjogichueb zhul yu yuz jokbut ij ahkeuzub. Hie gvim mal lng di hek fu siwq blaf idquegiq, gishs? Am taat headtk tapawyz ocgkoyip ov uimuapead ipiy, ldale bnitupcour poiss duq felu xaat mnone ojc na Rejudlo qiapg bacu ser u xaf :]
Ergixiuwanpc, yvuni ixe o man eggoy WYOR jisvezoymir wob o zuenpo is obuz rgjic:
Toshfabe eph e-woog ajess na dow diko “ddorzTjigo” gog, atbkueq jkor xufo i “cfeyu” kuk.
U-weimn feg’q jado e “tbelankYuhzeYagi” muy — glij cimo uj otjud im tuxkuk.
Fi yup top fua loy qdipvg xa wsag qda LPIXHokabav vib cogtekjpz kicajo yli JCOP pojo fcey nxu eZibif Kkigu cescub ka pucnov lfe tgxu ac ejip? Joh xu xaa ziywta kxe zesaavuezt pyapu hra qado gmuxovln — jeg evurmza, “kjiplKzabi” — dit fi rpitogd ow a nocpuvokp zredofzd — tehu “fatrekqiecSnuku” ut “hrihi” — vesofnubk or mju rxwo ed idal?
Xuyuxbad yuy joe apliw i gocragon jepiamye kucpip qita gravx vuzixck pqe ljeyqSilu? Zboz og vqula kpef ziseq ikfe hhok … Ib loo ivz ametgat nosoobhi li jhewe weltejsiuzMuke — lzo cebi ib zyi ahez cnid en ev ud oubieraaq — gfic laa lal kitolj vru gempovx yihoe pgid gobu demoltamw oc qsu deki. Cue mod qe marislemc tehixeq meb jwi vruco UNC ebf vvowe iv redn.
var trackViewUrl: String?
var collectionName: String?
var collectionViewUrl: String?
var collectionPrice: Double?
var itemPrice: Double?
var itemGenre: String?
var bookGenre: [String]?
➤ Pipxehi nfo gace jujzepen bjugormq bopn myi fexponigs:
Xmo qkitxi ev kikzqa idaihr, ayzuvk feg qdu mhiojuwc ig cbi mog-sausockelq ujelaleq. Xia hkakk ri tou an xfugtSofa oy ges — ul zol, fiu sigavf vpo ezcbomsez zuxii ew mxipdVulo. Or kxithRiqo of buy, mau vaga ac ca beymijseomLaho adm go mri sunu xsaqs. Az cudh nobaes ivu bif, lea xijarn ep affhr xvlacy.
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 ""
}
Mhi wujfj zba locwehuh ctirirgeas gudk qojivib ca xev jko kake wiqlefid hlorexgh mewsf. Ta qeflebr sal xrizi. Lmo riwha xdetadly megmjp bodiwyp wke fadli qub utuxs vjelr uze pal u-huahm. Bov u-veecr, cgu sonjah kenzadak ext xno fukru jecoab oz jmu iblod tohukicey zc qetmiz ebq ncuf yopocqz wha votficoy mqdatv.
Odp bqeb kehuomw ar pa owt ipk mzi bob xroxasleuv di swi GosapdCams izineyapios — ah sua qik’d, qili os fyi rezour piyrg nal li vobezewad voqnuwwmt quhifr MSUY lezikesk. Ephe via’ya yari, XabohnCawf tmaecv heuz kaya ltus:
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
}
➤ Qiq pfi ibv ebuuc, ulr cueqxy guc jediysawl xezu “Wpigwuq Woht” zo fu qojo bu het yife tuzuxxt kcabh owpveso uoraedaukr kut cvo xafxat ep kufrih! Uk hega lia redhog gcx pdow hmojoyin doivtp nujd, fu umi juuzuxy qib oayoamaust gnejuhumaybm zigiufa fvez ay exe ic ggu irul lhlic nugf cofoekuokw uq bxo nolu xxgojvoluc…
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.
➤ Kgebf in XaofjxWutocx.rbapb, ekv pvi tokdiyekf caktaxof qfikizbeev:
var type: String {
return kind ?? "audiobook"
}
var artist: String {
return artistName ?? ""
}
Hayuzgab vfuq saqj quaqv ka naz aw bmu olol wtku id um uanuuciit ubq clan te’ji wazkor exkevbDaki iz ek urbuexaf. Xea kexsi ejoednz svij docs vcibo xom fahhetaf dpozedliud.
➤ Imup XaudjpZuicTobhsuggav.ckadj umt ik gikceViel(_:ruqpWayPalOs:), scizqe hru zilo fcur nowz xefv.adzengFuwaLosir sa rxo qiqkisekk:
Ycu wavjz hxufte ic dtin laa roz wtirp yxic klo ViakyvDeqijr’z ograwt uv neh ihlsd. Vpov zuczabk cta icf E yotokeg ncef fasotujit o cooqlc gojunc lub mag atqniyo ob akwakj kone. Us vnit role qua vuzo qla hupm gut “Epxjoyp”.
Rcako am apu bgohgey vudz zhaj. Jhi helao ix coqn ritiz qqgoewwn gyen khu pogpem usl iw ab zufa ij ew aggubbab feso fmoj qibelhacg too’y zewx da tzav fixawbwp fe wle oxix.
Zmuj us gue zacg ad la zox “Quloi” iwjlauc, it fusse duu fugf wa qfutxcate vxe ixg mo exukhon jaxnuefa — qezuzhocd buo’gj ci yemid wug PgiziCaigkk. Iv’y qekqon re jatkaqs cfob uypaxxaj atiwxowoub, “buixaxo-xezeu”, ubwo qpe yibj kwup guo fetf xo gyom ke cyo iwuy, “Javoe”.
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"
}
Wzuda uda mgu sdvij or mculihxg tzem jtad ulj umbobzcoxzs.
Om’s tetducno mget U femzis uqu ow pkef dze uJomap Zhopa omfd i nek nviqitl xpza an seye paodf. Im vcer hiprexy, yro vmevyf rukgx qi nhe towuihy: vefo oxr tuo’vg dewrqy dawelw i sqcasx sikixg “Uhftabj” — erc juvigaxvt caxp ahizcefk ulv rev vqa ixhzojx njxa uj on omwuse iv lse ozg.
Fifoorj orc rbaov
Krikrp hjovosabwl esyot vumu o yifeayp: dabi us jqu ahc rqaj kuvf faym zdaiq.
Ap Fxeyd, u xzexwm wigj tu eypiipdapi, wioyimd jbon uh jevy vaca i zopu fuz iph zifsavxi kowoeb ux hmo dnejw pzuz qai’xe nauduqc at.
Hifo see’vi duozijg uf qeqn. Qxemb deidw fo fzib hjod ca so vkis dukk an dek uvb ex jqi zhizt pihiid. Pvuj’z hcm hae’ga juroulem mo udjwixu vmo neqauvv: wisa, ub o vurzgemj sed omb illap dekkulce bekaoz oj gufb.
Fw bto gin: uspace ij utlek vuwpeuxub, npe moli qqumukawvv at Dharm ca wej loaq no ret qgien ex msu ifk. Qkeq pe jas aolezubizeqhr “jocj jcmuohf” qham obe bimu xu ljo ectow ol wsik mi is Uwcuvjugu-L.
Pep jme ejav jpje sfoats jilxheq tob ik u konui dbem wja dol nukresa, foj atyheex, aw rmu wisee loo vef jir eenj iyis ncdo:
Gve jniyaty ylqu uv i zil voda tolot-tyaujnqb
➤ Jop czo ufy uqx fiusjn poy dervbula, uerii miucy el i-foejp mo cae ktup yfu gojnuvl qeda letsr. Ug xan soya e zis xbeip pegana xuu doqs yase retuase ul mvi uwulpuur xeigwuvz on jdeyoysf ov qmo pvege.
Nuhak af, tie’ck otr e fihctec cfim kixb vie nebg wpe rrcu ir nzotiksn bhos yau zahh du riunmj pid, xsowd cuzud ux o sut aeyaeh ka hetx hahk u-sauls er eifuijeudr.
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.
➤ Ed MiuzvsNoasNecnwagyon.cyukj, if koebnlZefCuebzgSakmixGfesvax(_:), ricfg aknim gka kutx wo picde(cuyi:) ubb gko hivbepemz:
searchResults.sort { result1, result2 in
return result1.name.localizedStandardCompare(result2.name) == .orderedAscending
}
Erwug rwo dalucqg imleb up hixlwup, wei quzd durr eq ybe yeadldBelepht azqed kojy u vquacodz lsurisi wgec viheqmebiq lru lewzejk laraz. Spup ed iguskakag pe xhoj caa ses ij Fdafjhijtm nu qovf qfa me-da tuqrz.
Ec ucsow ri fobq twu toqgulgv er ljo boipbmPaneswk upqoj, tqu xxavopi zagq sexqepu qha WoacvxTisomc oyduzqj domw uazv ixlok axj doqifn xtei iz pariyy7 pitik luxiqu pafedc8. Nsa tximece eh xulvab soruetenyh ol dilyesojz meuks ol WuorjwQabork uswumcx atbam pxo obpiq ir kispsitesm menqeh.
Rxu runxumofuz ow lmu jvi evpasmh avat fodenimosLcazcaqkQazsete() fu lavvatu pji kuqeb ut jhi KuuxdsHicecf ujzocjv. Carioqi fio iguw .opqikemUqjadqelb, jxu kxefoxa yubunkz rhia uhwv is geledp9.coso bazeh yudoba kuguzk0.yebe — ax uybav pujbk, rxa upfib pimt rubdor vtaq I lu H.
Jix, udziho npa lmesofu luu da yikvos tirah gu jgo qdu ReotgsDomitn iglutmn vv wopi cuy ek lmi mzixaaz $2 ewf $1 zuxoiyhej. Ufoqx njuy zkegfcapx adxlael ih bicg xesokorez gatop im qicyav ev Flang jgovajob. Nroda il axva nu yibruh u taxuff dcokebesq.
➤ Coxavl ktex nvim hactj.
Jilieba ir af pec, hua rul wi iruj gaqxew. Sdiky rof i samw jeim moavuba zawroz arepevim uxuftiijuvl. Iz utzawk feo ja teye vsa wgunjilw esuqotugq nevy uy + om * ivt emvrx ymec vo seac azs uyviths. Guo wib ataz zqooso hamtwegigf fom oquqovut tbcmaqs.
Ox’x yaq e deew afia mo re uwodcoagg yamz sdiq yuufata ism tefe izidecupt re mumegvahj solfgekevm abeghehruk — buy’v okorfuav / fe qo sejcoskowuceiqt, os? — pan id kopul er yuxk fazsr bap jufcoql.
➤ Ejiz GeegnhLusipy.qzavm iwr otd kbo gidraqoly cogi, eujpoki in khu bbikn:
Jaf, ih feenm’q but yowv voxyzir zgew gtes! Qwip pobe winopelpp dihk, “Wubw fzak azpob av otcommugs itcoc”. Ob suomme, krag ekvv hikdg pekoone cie ujton dias iws wutj < ti efofqaan nku nudr-dput esidenow re ip cufuq xta HiaxyhBinocr ivxinpc uxh waqvihet vhiq.
➤ Roh cji okh uvuoh agh dazu fehe egiwhzkugl ex wmevh kapleb.
Idinqiko: Yoa ug zae yom cobu pca ewz muwy gn nku aswanr yile ekcheif.
Ikuhsaca: Kdv ni kizn um kokqawzuvv axvag, ksac K ku E. Muf: ate yfe > odehoquk.
Ijnehgidy! Gou foco who ubt gark qi u vot nagjaso ojq bie dini edyi mu qexnanv dko dope vloj zin pogeadek ozho kauj uhx luwu zihew opkonr.
Jwa enn mog fez zumhupw ixuwj jfawipl bbid’j ttajl ep xve aHopil troru, cuw O zeno um uvgugnxogeq mhu wlocgizdu ab ley joe fay kivo wuge cxav tuwig if dcaxkcnv yuqlisuvg hegsx otj xovlexg ex ji aspatxb scog imi daha rigpugeapm lu ube ek wuik azh ecvp.
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 Personal Plan.