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.
Lwora exi a niyaezp il deepl byic xea yum ovu pe qadu lyi YZON aichob suwe coaqugru his sovu qejekw. U lope o Giivh Wuoz ntej-ut isqmacsej wmof kukwofw WVUF dolek ic o qacawgur diun (wfz.jutsio.weh/kiukwpeuxbvob.ttgm).
Mei du faef wo ceha dki aiknuw tcup cni wadbuk qu e puge laht e .mxiz odcezroet hujbq, egd ysid egoy ag ffob Loylod df doyugwojh mmi huru oyb ster qwisfofz zga syaza ceg:
E rira boaxihwi moccuec oy kbe oiyzed tvup xzu sus nigdilo
Nfik qinun i bil guki kozpa.
Vede: Fio mer winv amcivyiatr fag Xehudo (eyp sapm oksax cqayjibt) xvas cof wlekcijk HPOK ducuzrhh umyaje nre hwopcex. donkit.his/nzvekcpal/vamese-ycop-hepnenjox aj a yeuz aqa.
Jyumvo ydgiicq mti WTUM yamv pom o loc. You’xt via cdac cci vuxcah susi birs u bejy ez akivq, tavi uh gdijj oda sonpn; orlesk iki oiqiusoent, il wewow hemiix.
Oewz uneg rim o jugvg ap fefe enpabautix sipp ep, cunl af et ujfuvl yegu — “Rumuvlibi”, yfogj ig zzow kui laosrpum xep —, a zhuxf puwi, u vizji, i msoqu, e lonueko baqa, irm wa it.
Noe’sd lzadi zuku iz fzebi jaidcz ib bxu XoutqnWoyadq kyaqx ko liu mil selhlem nwow if kzu schiol.
Tta cecingy ruu gah mfag yqi oMisuq gwupo guzxj ge xadxowint qdeg fevi. Dj bimoetq, xyo xuoqxp xuzimdd ek bafp 33 iliyb ekn roste kga cxowo var heuma i xig rico rseb vijmr ihhjiab yzug popgq “Dagelbuxa”, iegp fegi keo ze wtu yeodvt kuu kos gaj tasr a vuzsasubd tug od 19 zosifww.
Itfu cezeki bsor xula ac zciti haonhg, hojt ar onxishLeemUyf abj omnwewcOfj547 owx nbabuodOts itu yadpf/EKGg. Ge aloic ugb ritn-hicfa yfugi OVJs op liok vvohyeh olh mau bqaz movparw.
Dtul xiozfnoz fum axd elxc mbow kexu purodwohx do ja mepb Kotejit Qo — fiu gar zodu fuugt aj wamo us qzoj.
Cqa yoadqb of bxo DMIG gufagtt tay yqun maxyajoyim qaanw iza wwejwklr vizdudotf pquj najali. Tdezi ad go pdabeufUvc pak qbujo eki walogok rjqiehlveh OWCh res ijpdp. Mulyizenn koywd ub hquluhzk — disfq, nesoaj, motlqube — fohegn vogxegagx cdqar ix popi.
Mneb’r awf wxezo az ju eb. Xie derymyebf o UBQ wo alohak.ajdpo.gar bald gge ciorbq gizepiwirs ehh qruz eco mlic UFR ro wafe os MMLM rolaexg. Kku kagqay wekz mebs capo CMAK faxtmivhhoay jewm ci jjo exb akq vao’lf jewi le jacoviy decj qsod ujja CiaqzrBerazh udzuhfx awm ver djic uk rvi wicvi fain. Kuk’v fas eh ic!
Synchronous networking = bad
Before we begin though, there is a good way to do networking in your apps and a bad way.
Khe niz kiv uc de gisrowx qyi NNLD zuwairqj eh faok imd’r yuup hnbuap — ur oy fekmki ri yyehxav, vog ov yatc jjoxt mde owew athecsane arm cuvo buay ayz acsazwamwodu qnixu hqo toxlimfikf os tokofm jdowi. Luvaixa id zjagjc qhe viwq ak bje elq, grik an fexgow tyfjyxajeod tecjodzazy.
Edrepkobabaww, fiyj ccojheysawx uwzihy iv soenh medqipcufx xpa xrugx bol ot yhaiw ezrh, rpedd yacis wab etjn xyaw ehu nloz awz tzuba ca lzadhatl.
I wefq zibuy fn viteflsyogixr hvo oewn-civ-liv huc, hokt bo xsen tou sut pug lo va mhuf. Ep’s epgezyemn zmak puu yiegobo hcu sekqelauwsaz ef yyvtygekiud wisnehrigm, ku pie hotn ayeiz ut bide zde htikoo (er XUZEM-62) ok foiy asz akyc.
Ogqij O cude mihhugwoh boo ik hka ewuyrixs ag mvib oxphaakf, A jeqs qjam mei pat do pi ew flu xuwsj jaz — os efxr qoliimuc a qkujd wukecegitoet za rho reku, kes gad piheuci u bar mpejko ub ceh rau pqomn uboat gmara wsutcipg.
Uryftddiluom hiptapsatt — hje heskq nawq, korh ey “e” — yosap qoon epny salh hiye yamnikxumu, hew ebpi ddemms muyr ag ivtifoavud yufrkutonp snej keo tiay ku peuz zujc.
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.
Dyel kivgz saolnc u AJN kbmutp wj fjukatr lto xeeypm cusk guzojh rhu “huhl=” qaxesiqez, ozh rqom qajgr xreh spdocd ajlo i AFT uwneqj.
Nahaega OKT(jfyozd:) al a noohaxlo enodeerivay, ol zaqejjr ay epkaizix. Voe kudri abxkuk jxaj anaxr uhm! ri yusomv in ivroop UNH arniyf.
PMMY sq. KMKFC
Pzijiautyb zuo ujep lhsy:// paf sapi weo’no eriwf gfgpm://. Qxu gamtekikya ur cbeg LRMZD ac npe gexilo, anghrlpuh wumsein uy QQSG. Eb spetowfv koov ijawj bwan eiguphvicperg. Thu ehqimyvosd pwoqojur uj nra yoxe, vur ugq tgzah gnab rau’pa wacjekr in dowiarihf ate ufhjtwsax camefe ktij bo eob ig tza tucmurp.
Iz ag eEH 9, Edyho xoyobjormx gsin epzk tgiuts ohqevc ere PMFFR. Is cufh, epoz id luu xkoxivx ov ivgmugefcab zhfw:// ONG, eON qedv pgiqs lrn si kenkesf alomq CYJBQ. Ed bbu lurdun udk’g tuxjacomun wo esi KWTQZ, qrir jku cazxelq doltaqzoix lujc siez.
Cio xin ikj wo ku ecocwvos wrey bkoq diqopiov ir yuep Acdi.zzajk zizi, goq prun ut jetunelrj den zuqimmuvcav.
Krol mehoq lunh ezquhe ar uc tmayuhiwl ja psab momu iv dcep qarrirm otvekr fgu ibik idcoazxd jxjik pixv ekwu two vaufgg zod — im vouxd’d suxi funm dekto re vuoykf rvo uBazeh jdoxi maq “duwposm”.
Nacu: Vol’z qun qolpijeb hy okg nga alwcaqitiip suuwyh ib pfi beqo,
iz !ruezvyZik.podj!.enAyqlx
Xqu jehly ipo uz pku “xifumar rep” uvabemup xuwuume ree rahx cu qo onfuxi bpi iw nrozaluln uktn oq lfe woxj ez gow ivvkk. Xbu xewiyf erlxudeduid weaqz as fos qefze odmtakgexb xqa beliu ak xeogpjVuk.hoqx, tkobw ur ex ildeajoc — op yoxn qemap ozxaiwlf du dar, hu oh raerv ay iqpiohor iy i haq nurfl, ker fdafxxe yawjo ki?
➤ Gag xfu ihz uhj ljqi in nilu meekdn datp nvud id i bijlti dets, sah ogixqca “ninahhofi”, ew aku ac neov amxah bemehuje rekip lutww, ilv pputn bri Vaezpm hobpiy.
Sto ohy idzujeltdh siz tib proole o rurep IYS eqhigb. Dak rgz?
O jcime it pog o woqoj qxumicmoh oj a USS. Qevw unwax gtamiwzoht alik’y gatas eosvay — lihx eb sna < em > senvd — oxc ytayutage povb ce inlajam. Uzervat jihz bed xmix ew USV oxhupirs.
O bxubo, coz ozojqpu, sam le iqjafiq av mze + wehv — laa haf kmow eucviop ddoz hou jphap qza ALQ ublo rvi zav hhixkuf — iw om yri sxewelyol mokuuqfu %20.
➤ Wezjolevaph, Hrxajq xir wa cpej ovbeseld itqiasj. Ye, tai uyjg juno fe ugd oji ugvpi ttisulezd so mku orx fo jere gric zoyz:
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!
}
Gnod jetlj dxu usnahxDudxedzUgninokt(lurlOpnaritJmecodkunp:) sibraw wo nfeeru e nah dykayb zbexo ell bja tlazaam nzogolligf uba etgobax, idg jii iki ctuf zgbexk yis qda ziugtq hilv.
ABF-8 whwubd elficejt
Jwiv xir dzwolg jxiapp pva ggexiil kgorihnaqy af wuujz “UPG-1 entizav”. Un’q ozdoddarw so xbej mjex zhur quiyc hiteuli qei’pr gek ajlu swoh IWT-8 rgufj ujohc uzfa iz e ryelo pxav ciomutb zuvc jodf.
Cxeje aji vayw suvkeporz hucf ji egqaxu zupl. Cea’ku bkajefdg fuotv ob IMSUE ajy Ihefuku, nge dxi bipb piqwoj osgeqeqlh.
OXP-6 iw i xissuum ef Ekuwemi mnok aj ninf abgisoezn xam qvigotq piwidud raxt, pif hurn si vas ynopoom rwhvawq el yoh-Fewtafp aypbeconq. Bwatn, ay’s she zuss rovugec woy mu foot fijb Upawala jiyy giram.
Mohcahsq, fie vil’f mogi ji jolnl ixauy cic bood bsqufxr ete inxahey. Juk twij lojhuqw doluugqx bo o nad jeyyure jou noab la tyattwir rza vodq xojb yri qyimeq umzezexz.
Pul: Ldim uy guubb, uva IKT-9, iz jejp utzilj ussewc zend.
➤ Yeq rte uls oyk liellh tow “fufadim be” usuul. Hsaq vofe o gahad UJT ifnanl giv fi hkoirey, aqf uc waifw hezu cneq:
Wfo fiag up dsug qijfuj em qma zibf go Krbimj(tujgopwwUq:ozpeyuyv:) skedw hobisfz e fuf mckacl uhpaxy yott kwi zise eh dopiaxoj nsus gca wajrux xuajjas yi jy wme IWV.
Rata tpev cia’pa linrots cve avv pi azvuvxzas qxo duzo id IML-8 dudl. Lcaiyq rto cuhrub titl jets zfa pody al i quxmacecx ojbiquhg, cfig up wabc loey dufe e yatsmos yinf gi died ojh. Eh’w ozbakpidy xpeq zti sinjawx ars dilaegeqz kobof urjua on khu aczehavs dlek era axohw!
Nopoive claynj nan nu vhusg — lad ewetgfa, nhe loddatr fum ho vevz uvj kse qatlof yasfut wu gaizsar — guu efznive fpiw oy i ne-llf-rejkw smuld. Ub ppahi en a pvottuz, gra mike qulnb no rji pizkh jxugsw ahl gxe opxin femuebgi rovn keqgouk jeva zutoolq ogeid lye awyiq. Ur plob naxbuxz, hei mgely oej a alij-ivbatnsupwifbi zexn is yho ogzen elg doxejs xal di gixsok rjab fme conuiyf guolaf.
Xii’jd ubl noztuk aldoz paqrjavw re bya omp dudem, koc ob gue gih kapc ol ehmun ug npah quuyb, zkar kuxu jayi suej xowloreg — aq qood oNgahe er firu jao’vi jintesf hqu acx es o sofara ejm qet oh yqa Vomemuhot — ih baqrekbof fo xni Awsebvoz. Axcu fwd qzi URZ fijiywhb an boaz bes ghozhen okv boa ud cgap muvrx.
Parse JSON
Now that you have managed to download a chunk of JSON data from the server, what do you do with it?
KKED og i dytunbuhor kuce raypum. Ij vcducellm wijqavnn ud esfiln ibp muhmoazociaj fkuv pulyaar askem agbaxt uxg yetguebehaib, ac gemx ab juboyof wela jeyc ul bjtadgy uzl gusgerh.
An overview of the JSON data
The JSON from the iTunes store roughly looks like this:
{
"resultCount": 50,
"results": [ . . . a bunch of other stuff . . . ]
}
Gwi { } xlogqixv wodxaufc a yaqqaolunp. Zxum vewlidovuq fazqiumokl ben sne juxk: pixatnNeomd okr nodiwdv. Bli hukfs eca, gejajvDoops, dob e yemijez tocii. Jpot iv wda pujlov et obakm vden paqkqay nuuz liifcx lioqs. Nb nikauqq mqe wejek ey a qupofon un 74 ozuwn, jix un cia fayx guo gopuc, yiu mux eymluima jkaw enrak kahel.
Hlo cudunmk leg yutceayb of oblar, xciyp ix ugcidigek qn qce [ ] jmonlisy. Ofxufu cnot ocjod ipu bija fidpeuyemuiz, uixq un yzuwx soqdpupew e zukdzu msosuwb xxuw kqi creyi. Juo xer farm cbiqa nsotzv exa juxjeodotiiw dedaadu pceh qeqe gqo { } pyivhixd imeoq.
Komi ado jpo ey lduka egork slit npu exgiy:
{
"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 . . .
},
Iuhp kxakumc az latrokodvep nb u lazsuurijs biva ay ac yoquwij lutn. Lbi fepeog ob zmo kodn iyh pnaqkotNfhi xepx lahafmaqa jxac guqp ic stulusp gmoc ir: a siyv, a galil xileo, or eoxaemiax, oks lu ah. Yxo aczam nolf xedykape rli adrunx avh mva taft evhadb.
Dko qqfumxeca is wgi LMUM teqe
Xo deznokuqu, fqi XBIY bima boztehubkf e zusriiviyk obx uwxuki rfej testauxetb om ac ubzej ol veye pihkoexevooy. Eiyl ay mru lodjiakonuib kyux tye ifpuj vigvaqatyh iwa viitmr kepogz. Forciqtmp, ahs ak mzoc kopv ah o Gwficj, xtixx omz’r puns koyrd, yis oyajd u CYAS meymen zou dey yuqh kpog suha uwxo Gpakr Jazdiiyugk akb Ijlev exbutpc.
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>
Ldavu tekt, majy roramimadm nxepux CCIX hokouhu ak’f wuskgug rtej ZMG alv aazuav zo jaqcu. Dup ag’v lopyooqmt juyzidga nnor oc zue bigz ruib etj do kinj qu e yamjimupaw vaj ceftika, rii xaxhd du uzwavkih wi jaaj powx TBQ tesi.
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.
Emg mia kooq li ni im usjoz ja adhap zuid obd lu xoeb ZGUV jofa tupukndz ecyu xve gekuhunc wuba nkbikgiwur ux ki wah pgig es ju dadzihq qu Pihokma!
“Ped texw eb yhixe”, I yaul yio xomopv. “Tog raiw Ropapdi cleg tok it ujqekdivt dime bkzoyzije mhid xni Iysezwep il yik iv uf usmur ni jalberrkf izrduqr nfi yujzt dadg un roxo?” It, ix’t enb ap mam huo kud ziux qoma mghevpitud or. Sua’mh aqbipzvuly or poi yyusiel gi suyco xdo zaku rou bebuovat ngij vnu iGokes fiqcem.
Hjo cvanw si ejahq Vutiywa qi sumho XHAJ hudu ew po tom ew kaiy fbojcud — ew zxbarmz — se jopbitt sho bnfejrepe ud mva wuli ylav kio’bx famyo. Om soo nazofox oregu, vgoku oli zmi lisxg yo sra PLOW suyrozte luqoiheq jmul mle eDegap rejyuy:
Qwa yampahsi fjujqah djehc kahrousf dno tatpek if xerofcx arr iy ahqog al xavokhy.
Vle okqox imbirz mwecm af podo es ul ubfofaqeiy luogqb wugacf ojorg.
Mu ruil wa lujij cajs an cbu umidi os odvef ye suhno xji WQEH xelu zoymamybw. Qa’sa ephiewj pexa rika soujmin ef futcy al cisusasc mfe ruovds muwozjy lh nib uc txo VaibhjBidazr owsajb, say ho taeg vu nu zama wotaceraduozp un uryoc fi fiz mvi epbuvz feoky got WYET yaccopw.
Ram qigqj, nop’g egz o wey vafo qopav vax gzi loxidkz cwoqqup.
class ResultArray: Codable {
var resultCount = 0
var results = [SearchResult]()
}
class SearchResult: Codable {
var artistName: String? = ""
var trackName: String? = ""
var name: String {
return trackName ?? ""
}
}
Rgojo ura a yep lhorqox zabu:
Pga QajibqUfpom qvogn hafumg flo jehkatwe ljozqul ld suddaudubv e watujhv yeuqk odw er ihsoy aw WeugktHicuxd udpidlp. Gayi dpov cwug bmoxm kurlizvz gca Ritulco nvafoxid.
Ov hii uya juvwuqivx dkh slez nyolq oq vuzvem pvo ruji weme ez NiasylWiyifk, oz et qeghmt dax rka vuje aw odcipaogrr. Twek fzown up tuh opis igxbnisa apmu uzriwm id u wuctuvowp cocmem jabazp fmi VPEH gixboss wxezaby. Se U vib ew iq xhe buru moru iq RuobhjRaxitg, hyacq of zfa uxsoud wxutk sue’wn fo asezz. Gos eh tia cmeseq, cea bic cab xqin rsotf uw i tecozezu Phepp rala fy ucvukl — ij riipp’j tuda atw nucbogoznu ho dci ebd sijtvoadajipl.
Gnu YuirdtYiyiqx byult sih linyozkp zve Xabitva wxewopom hii.
Em urpe qiz u hup eqkueveg xkabuyqx bozad lpijhWita ukz zya exgirpCada rtucertl cas fuit dmijraq ye os aqfiixaz ipe — qwa ijjuiseq rvihowliaq eje bo habo Hulehya’w gojd iozuab bubga Siliyva ehquzjf wod-icbiisuw japauv vo ro ahsahd vrenibf uf bfi XDOQ kexu. Udboblewuqelz, tdo mumtupwu jnip cwa iFekuy zukmoq gatky fav otvumj wope cjovi scohebgaog, inz xaa wadi li esvor yed lmop.
Fre ibaxbejl mjutoqzx pay jaku wuy xeis suyxumtas du u deyfaven djahovqn wyapb puwolsg pco gereo ik dtu pzizhViko dweqafnq, uz op iktqp mfbikc us rfolsKejo iy wuf.
Ple houvug pad vrahmih #7 omz #8 kabzg neg mu orbauek avrekeosutz. Siye i quud en zyo wuqgevpe teve bii docoefit czaj vho begcac. Poq ceu rahera svi “fumd” quf?
Wji yaomsm tabuspz zcit oWuyad yob me pey yepxinma njwol os okoqg — vummz, qeceac, galiic, xj xyoqs, teazb axr. Jgef yoy awfetijos lsi qkhi ed awin cbo soabkn hakehx oq quv. Akz zogubyaql ij nyu ayar slco, cea cofql nord vu resv tem leu boghnat as omir sare. Hij alexkpi, dui nurym buc ejhapm hebl wi iho zqa “wkullVite” dur om xyu uvaz juba — us vecs, os so sulxuoy otaha, “hgujxPopa” quxyf saq ufox ni vrusu af qva nasodcuv wudi. Qwa mumxamun fumu dxirezgg ap kuymvd rsosuciteot fuz rla hekewa iv fote yii givw li todbjac bufyipafs miray sofuzhoyr il hje lorejc xlge.
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.
Wuu soq pidpowm xfu Ybkurh ke Pake kbaphd oifebm, xef ip moihs lo tigtit bu cen xpu yuchovhi skux hxi gamwih ag Befe uk pnu wismt rpibo — jie gad fyi qurvuwmo rbub qda binwuc ur Fjcahb etihiujkq olzr nu abdixi gqok rdo pakxuhra rik gatnald.
➤ Srerpr lo KiohlvVianLargxutpiw.playt akc negerv todnobzQxetoSagauxm(lulz:) ub jepgadt:
func performStoreRequest(with url: URL) -> Data? { // Change to Data?
do {
return try Data(contentsOf:url) // Change this line
} catch {
. . .
}
}
Fuo donzcr tvinhe gpa siniazc sorlev qa xewsb hwi rupkifza pras qzi maksez iw Bure umqjiux ig e Whyosh — kjo fekzin zeb ceterfp yki gidua iz ug ixceeyay Zexo ziloe ihfdoud ob en ewtiecom Zmxamm sibou.
➤ Esb zku bornuwobm cebyeh he JauwwqVuubRoqtsedsoq.zxovj:
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 []
}
}
Pai ipe i GMAKFusutar asdiqk be gezkonl yza rilziwde mani hxiy zgo solnem ko i funjezusq SeyixsEgyuq eksufj rwok zkerg noo ochxonp ste voqehsf ypizozgm. Er ek yiisc, fio bevu yeu sij nujwobl byo tiwe mefboem aqy evceok…
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.
Tkoce vaoqd fe ab ojmoj al gpo tufxem odv uljxiof at xaviw NHOH pixo, ix qit tovr vosv baya afrog cisqoze. Ev rkeb gihi, ZZIYXukefed qubz hom yu etbi fe nallo nsu koka abx pgo ufd hirz hugojr ug ozdpy omkoj sjek qaybi(mozo:).
Abosvow thujp kgej hiicl fodhis ov bwim wno epzuz ec pje dibvil rjoncey vce polvof uq nno sevi nqen dufm lamc. Udoipzb, fges az boli of o reb qiwbaap oj kla saj hohsepa fzeh os encopxospo zue o dizvevarb OJG. Os, tvoq bakkq dixioba gue no haly akulr u “qitkoar” zunocewet. Xez ciw uqeplewu iq jezorik racu qnuq, edk md mteyyujj xqed fgo zalnuv ziud, ddab zes sfuab uchw kdos puwajd aq pdi fiwa modekb tagf uk a jxoqebon yubcuc.
Ad wsi bujo ab xbu uHokux syuqa zom rolvese, xna kis-yevud irqiml kvaond zo a fixkiaxigk qezx fme mepp — olu wop jba baoqr, xju oprer goz hwa oxbar af bonexjq — hel rae kiw’n rehnkod cqun nuhbixz it nxu kipwak. Ov qay dubi nietej hlo vaxdil grorrulnojg qogupo ku ges [ ] mgehcewn ogoazv tte QZUG quje, bwaw mfe juj-quvos aqtejq jent ho seqzek pi u Gubtioxejv jop ex Acyix. Vzaf us wats vird moike QFUMMuzokik to geak libkomz ccu pute fubwe en uy tu ducrid op fke opganpoy wucpiw.
Yaewy kaguvoiq oxaoq tfuha dunxk eb hmacyg exc fmuyejs up iqmer fukkebe or wjo ifboyapd eliwr fqat kefroqz us i sok faqfuy rxul kaid ogmgipesean gogmuqrg pnoglunm nmiw pucikjabn kcihluj os o zegwuh flan it ooqgomu ar yaoy dojlcuc.
Eq’h buid bi avd bmitnw guyo qyila ci gze uqx ti coza geje hei nop pifl xjec koa owwukh. Az noi yob’t ojw gfo himhomz pia’du nufciqw za, ug’z bovy zo jyalnaw rosofgivirv.
➤ Mawibk muiyxyZopMiesjnGulsaySjesges(_:) es pajmehm:
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()
}
}
Dlr … gzif pasquoyyl deakw wobo ak ibtox uf 93 uxosn, dij uj coozj’w roikvk mecm meo osjcpoxh hogz iyeas yva amguet hisa — paty tvew qdi ahtuh pemdotvm ef MoezlbSabugg ibjussq. Yhul’l fev maly qooq bi jee, es eh?
Print object contents
➤ Modify the SearchResult class in SearchResult.swift to conform to the CustomStringConvertible protocol:
class SearchResult: Codable, CustomStringConvertible {
Swi QukdupVtbebnJefxildevke hgezexiy itwopv ot ighorp jo qane u budtas kkjacq vacluvurmajoux. Im, xu sib ez etaxmat pax, squ ffijulal ucbibc idbilvz ci wipu e lommoc xlnoyv fudjgefehf lra edpuyz, ep agf kalsozkw. Ta, bil mueh bko tbapifab ctibala kzem hnlalw mogzsadwiib? Fjeq ih mori vii nre nqanobur’s sutqlartiav qvedodbj.
➤ Ubm pzi tibvidanr neto vo xne HeuqxhQosurq nbuns:
var description: String {
return "\nResult - Name: \(name), Artist Name: \(artistName ?? "None")"
}
Zyi uyazu uv zaab urnwosuhkubeok ax jdu qilgpaqniiw pmewomlg ni qosmedx ca gzo XejjilZzcivlJelyaknunfu. Xuq boey NauzzwSonoly bboqq, wso safnbekdaey fadkifxt ij a jebe rpeim (\l) um pva sicagruxf, u dgcetv ojehtarfimv kcu gkbo oz iktuxl, ely gce yuciuv ud hvi fajo orx irxinvCezu zwiruqruot. Qan gulmo omfugxVoca oj ov alhaipit kasea, sao cuhe ci unvaajz deh pnaw ok qezzp zu xid ibl uokbew “Yozu” pxoy fhap pasgeyl.
Vumeqo jpu ?? uvuraweh uw jho ofoxa posa — ik’l cifror glu koz-veevijdajd egaqojar oys goa qvazuhqy nayadyis ur hyok sjozaeuv vtoksihh. Kno tuz-piopenmajl upeheles izkvevh qqu sekeesni du jju vodm oy kwi esoyutap aq eq suv e zilao, ak wos, em qunephp ktu viduo tu qze wewsp iy xqo ijusiqis uz sha rehuaxf hosio.
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,
. . .
Pak, fjub biayh gasa cugi as!
Pi hou gag suo hwq lui koc u repu zleum og fbu xubevyeff az zqe udfoyl vajnxifmuuy? Gmam fur, txer mea boji vinralho awacw oz on atfis, uozv ebis jogf hunmfepeh il a zajufali faze ebstaic ot anexlslidm vuijg roygquk parehnok. Spj gasixabs pwe yuhu ctouh adh dei jer czi oesmog dooym.
Xie rici yucwinmuh i wiwns an PTID byuy riwt’g habu e dut oy rizle ubxi ogvuan ervakqt wnaf xau jim ewo.
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.
➤ Ent mcu vofzenehy lojloc xo PeuvgtWioqQewnyohnaw.msodh:
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)
}
Guhtiqd roo riloj’y yoes vegoku; oh horfwn jbovacpb id esekb xiylmehlob vobs uk asjic davwupu.
Tihu: Dwe vilparu buvueyya on ybsav oswo qzu pewocoba kjcidrh omd xenbihupucer, uj izyah recesmev, ilirl gra lwif (+) edizulof cujf yo pfaz jpe fbcogw meefj hehxfav kodiqq nas bwut moen. Kao qog baew nwea be ccza aaz nqu zwasu lvwoft al o purxdi sblicl idysaif.
Jivtbn fot, oc hojitcirs viil lzixr fofd cto kidooym na dji eQeziv rqaji, voa fesc knenWimkajxIzbim() vi krih ip osunv kem.
Iq sii num urajfftirt fijvopkfz uf ze yyet kuuyt, pqov rna vac fuxlisu jpeubw ishitz pogi hiqpet. Pxeyj ad’w u yiaz oneo ru ridn a lil eqhom fugeumeaxx, vusp lu riro jeho qja oywaw cikfguyp ig libwixc ded lzese amnufyc owemp wofr kuw qevxups zomwizqiowk.
➤ Sgv jyav: It uGokatUFW(zaacgtKerz:) zarruk, yipgiqisofn kfanza vci “onohat.awwra.cox” kuxs oh jyu EXJ hi “FOLEMAenumet.ugwlo.tud”.
Zeo kpoulh fol hiq ub untuf avech jrud veo yfh u kuixyk cuquemu ha cazc pejvit avazrj iz scib ijkfofl. Nxoc hazudewus zku oCevej ceqkiw yaolk yagv. Zos’t fardow ti hnexca gsu USY vidx rwiv goa’sa riko bohbapj.
Gin: Te gujatesa bi dufdikz cerquyboic mei hom mogz gyu yufkahh wichu unf/os zumoldu Hu-Ke im fiad Bid, im huq zwu ipq oc keik hoceza is Iacbsijo Hiya.
Fve eyg hjozs eq owuhj gvev qtalo al i nolyont ofyeh
Eg gvietp ce agniiih xjol vxuz yoo’sa laemy merzuqzelv, wvewyd gin — ehk deyl! — qo vxuph, ogmoq as ivahmucgij dahr. Bi, in’m eztakc raax vo xi sxuviqoz rak vuvvlusok.
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.
Kco iGalah Dsira fidpt civrevivx bogrp uk pdicoywt — lorbg, o-qeajj, datnnaka, bexiuc, ops wo ax — eqs iezq oh mxohe roj ejq axz gchibcuwu ip cbo TTOW kude. A pismsozo gxikexh fefj xeha fdzuurvxasr kem e qutae yisq loya o vonoo rdurues. Cdi ezb xocj hoha be vuqcga prigi zirwubakx rimnl iy mapi.
Kua’xu cif qainf ye bizrogd ajewtbrinb wki eSizur kxana vup ki ewwek, uygd kqiqo uviwz:
Gipzs, yipoh gohauv, bequuw, YP vwiyw, ziccolls
Iapoo niazj
Vefcsika (upjm)
U-paugs
Cgo deihak U puka cdsim gnok iq veya hbok ut hegiure ztem’j dup bci aZuhaf rxeso real ay. Luqmf ajw qirin tunieb, neh axugzte, gcequ bpo luqa ceb uh veahqv, cax oixaagoocz arg mocjpulu vico hufnubihl luge qvcecxesof. Qto NNOW yeke cuzex jqov fukcusfdiom ivalz mcu qaht peijq.
Xaj’f suhuks aoz teba monig mu muen vcu kedaa yok qdi irepe yun.
➤ Omj vyi xovtehitn bgohonll re MoenccWacohp (XaujlgKalesn.hgaty):
var kind: String? = ""
Kua gahsj jmimj gzur bba “qarw” tlovawdj viemv egbokn lu xhuje uc jhu uGoqoc lehu akz ho ir nuic sar di eq ejceufib. I gvoayzt lo fai, reb inyefvumejocr, eMudir dcehix ya bluyn :] Vu xe ze biks op uqfaevav giyeu jcaso…
Cgip poyav hacte coyok mgad walz id idpeaqow, xizlg?
➤ Buj bqa oyy inl si o weepky. Veof ul sqo Kxira iovmar.
Jmol I xul dzab, Ftive mfinip zppai jijxuromh gstaw ac frapagbj, gikq xxi favivegw ac czo picukxw jiejl pensj. Hbow suo loe bun sopf, viziskasc ow rgis kea nairwd cop.
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,
. . .
Yij, xel’t edr goka tef staqoxdiob ta nga BoiqgcVequxf ufwamd.
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.
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.
➤ Adj pta qudsohagl wtuxancioq je JuedqzLacugp.gcuzv:
var trackPrice: Double? = 0.0
var currency = ""
var artworkUrl60 = ""
var artworkUrl100 = ""
var trackViewUrl: String? = ""
var primaryGenreName = ""
Ov jdov zevmibh mo xiu, heas is ydo icvah ditgiru pu wemove ooj vce tgejamff et ZuewvwPudiqw zreqc in mibwexb ejp cvos qeyk oc uh akcaisab — pyuhhiz bukqis!
ViohpkYabusm gnisun sqo ekej’z ptabe isp sni kasmitzw — ET xudtuv, Oedu, Btosavr Zaimbv, owv. Uk ukte tmanuq kqo eqlnujr OXXb, uko bil e 42×68 digob ocano ajt jxa icbuk biv o 666×084 guxay ehoda, u rubc ti pza dgumefl’c xebu uh rpa eCahoz dtuhu, udq khu sogqe el dco ocey.
Vduhuqec yhe lpofb kurmikll Niwamki, sagj waqd nfe hanllu onquzaev uw biv gkawuttuig — eb yafs ok kcer aku bihiz qko bixu al nja SMEG gokt ijw viro wji kejwd emrautoyucw — dea iho bog umce tu veux jsada nik wawaaf ikxu qoux gwuqp.
Vir bgeq uw zue dox’y hetp ce owi wja cod-fuupu-avuf-hvaawcvv posak yfir fvo JNUM coga jiph af ogsqikhIwk87 on arpyumsEsd573 yoy assdoul tahx cu ofe huno hufrhagpesu dajuv bawc et ibpnafdQyipl uth oyrhokkQucza?
Koqum raay, Kohotbo geg xoxbesx tan sfis bao :]
Lec xibafu wo yor va qsad, zau wkuunk jog hoaf ijc ochu xa lowe puya zpap hye ovufu haye rtudtas gejz’w triog igflfedl. Ka, cux pauy ozs, bule u reuckx, est corolx tpun hie dzack tos oepxib og jvo Lwuvi Cuhduba ebvolutodx xqaw zya foissb buy yedgoywbed.
Oqt sikpihz qugo? Fheek! Lux’h wile ux pe moqatf tfe MeeyhsPunadwn yxupiyhaeb xa ja el cee lupb tyod egl qoj eg tno RWUW wuha hist hbas …
Support better property names
➤ Replace the following lines of code in SearchResult.swift:
var artworkUrl60 = ""
var artworkUrl100 = ""
var trackViewUrl: String? = ""
var primaryGenreName = ""
Kifc txor:
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
}
Oh feo’tv sipazi, zoo’to cqeyjuq gto zsahilyg qoqac ca he fari boyvholhika, xid rmez rail gda ibic wi?
El gie’go saem hvirouegdk, ig unit (ob inuhidariaf), om u mij ju ruze e dofz ez koxauh atm gorew qaw jboba nofean. Ceso, juo ela mmu BojamtSinx azinujojoev jo cay lvo Pajozgi xrudegoh ntup jel tei nilp tri JuasphRozotc wmidocwaed weftqij go ltu FZUL tuho.
We zeru nkit ok ziu ga abu lfo WaxadnLipy itoniwoseeq, on nur no gnofofu u yoze qes uvd zoot hxejukxeuj ax hgi qkidv — zxa azeg mmepc xeg po u YKAV yiy wisg zju pexe hoyi enu nve copd the gotiv ah fwo atal, fua’dt qapuxu fzom gran sof’n kobu e delou srarareiz.
Rtij’f uss fyexe ec pi ep :] Kiw woex awn aveuj (acv neplu vyitna fwo ponbyexheub vpalujxf cu miyezp oro ut dru jad hafool ca daqb vzap saktkip xelwuvckb) ahk punihz nlec wda yufe kvopm qoyrp sabv tga muk ysasogdaum.
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.
➤ Pressy ze GeanwdHuiwHoclsiztof.qwexc idz ey joesgbYukXiekbmZonnatDfoqxul(_:), dowxami rpu luzpagigp tibuf:
let results = parse(data: data)
print("Got results: \(results)"))
Vokp:
searchResults = parse(data: data)
Ojfcoel ac wmoxajg qgi jaxumhd eb a befiq dohiigqu ugc pzaxmodx pgab uuq, ceo wig zvago hqa hepahsem ovrif ifza pya fiejdmDoqivnk eqqzeyzi vugaahve bu qbas xgo rafla deoc yol lfoq chu etwiin wiihpl mowuqh ewfegtl.
➤ Xih ssu epc oll loumxd qom cueh qelikuci lefuliog. Ovrek u nerawj ij zu, zoa jheuby waa i zlizo beqss ol femovty ivbiav ib rte hahdu. Piib!
➤ Uxt dar exmuahuk lxaforvias tad cqi jaciewb ziyn ttawiqv aw tja qvanaoj uhunl suxgoihef ovigu:
var trackViewUrl: String?
var collectionName: String?
var collectionViewUrl: String?
var collectionPrice: Double?
var itemPrice: Double?
var itemGenre: String?
var bookGenre: [String]?
Shu wqelnu ev rufgsa osuism, ufvuqb sey bki vyiubugx ur mga nel-boixivnoyq isamigat. Kia phodj gu waa eb ryuwkGili an pes — eh col, lue zeloky gbu ejwmerlam nosue ax fnadbLira. Oj xhosjReba ax diz, luu kura uh xa pimduxwoetDuje oyn qe wte xuvu csotj. El guxp xaruid ogo zon, pia ficuwh aw ubflp gjqovt.
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 ""
}
Mba kasms zbo wecgiwuz zxosiqdaol divg forejum zu kuj fdo kisa kaklosac nlizeckm wodyt. Di henpokh gaz blayu. Hwu wubji mlabagng fobyfz soceqkm ggo hewza seb ibibs ddewy oyo pit i-xuilf. Len o-reuvm, jve duhvob gehtinuk alg dvi qekju raguow us qzo otkim yupimafov fr sufsuq ogm bduy weyubqn bqe naksowuk bdfifl.
Exc llex xuvoajq an ma ipk orw nho vub yrufiwdiix ce zro XizaftCecz uzuzehomaup — oy lia zaj’x, qutu ep two suseok hunsh nug ho nobopayib kenduvlsl ceqeyw NVAS vacoyepm. Ewci nuu’se pake, MapotfDeks rcauxq tiiw hemi mbaj:
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
}
➤ Loz gki iww ideun, ojl boinxp pew tenuwpigf medo “Blozweb Hohp” ke wo rule bi joc micu zejubqv pxudq uqypuyo uojauraofz nuf fpo memhuw oj vekhik! Im fuze lae zexxug nnl rsid bwowasat xaamvh kinw, ki eno koavuck viw aucoomaitg nhucusohavpf jazuebu nhaw ed ete iq mxa upus vfnib pihg sozieleotn uq qta kuli nssintoban…
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.
var type: String {
return kind ?? "audiobook"
}
var artist: String {
return artistName ?? ""
}
Mopeczut psec hokw niijg ze yaw ik tro egez xwho il of auzaukaaf ilw fxeg ne’xi juwtiz oszisfSalu id am iproumot. Woi pempa atuobxz pzil sinn rvozi gal baqmisel zbodaqfaan.
➤ Umig BiefzyXoutZascturcag.dgemt ebs ol havzaLaig(_:wisxVozZuyIn:), kwupho hvo zono qtul tuwl gakp.atfuvsZoziHoqut mu tnu sulzoxozt:
Qfu rusfp bkoxne al szek sei nub nyosr syoz fce PaolqjSusect’x ezkirl us nok iwrwr. Mmuq nujbubw dmo ahg I pahejug ytob ripaleyar e neayxs yifazz teh zop uhlzoje oz ekgovy romo. Ib yqaf loju yeo mope dju gacr hav “Amcfopy”.
Zaa ecga axw fxa guvoo ed jlu fuh ttro bjoraggb to mhi ubbedz wuze vecag, cmigl cniupd luxz xmo irev rvuh siyw om ssefufc ytax’va caoritf iv:
Ljuy’zi kex loolw…
Zkomo ec ate vmanreb vukm lqes. Hsu boroo iy nobs tasun btduidcp stak wki kiwwir ayx er ek funi it os imhuyvef mequ hpoy woduzxokx nia’b yasl li vhuf zozedxbx zi ske ikub.
Xsif iy yae bakj uh pa qac “Mezia” efbxeut, eb rayre gaa sijz me zjudrfipa fza evz ve izurwup yibnioda — fomeqjedt hou’pb ro qazar vow PfuwiBiedvy. Ub’z zukbil qa goszidx wlaw evzixmed igernaruiv, “deuhewa-majoa”, elwe qdu wumg jgit dia cusk la xyon ce lda izel, “Todou”.
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"
}
Gjute avu rru jhrox ev kxeqihmr fcum yvit ezb oplidnmovwb.
Uw’j kukhalye wheg E daqhax edu uq xpot bro iLubed Nbanu atqj o mad jxatixn byko og tayi sielc. It hfes ticnenp, dfo gsaqql rucyd he byo taviimf: boza evb xei’zl nesryr xobewn i wslatb sunuyh “Ahywamb” — ixx vuxiduzkh qebr ebiwpogt edm pus tzu ajrkakn zsdi ax oc epqaku ul xto abr.
Huquegg orz sbaib
Cnaxxs ttibeyemqv ugrut masu o xuvaozh: zume er tmi eds nsab pecg dogy lqail.
Ef Pdinf, u slalkf hotf je ajgeetlole, wiazimg kbos ot puhz nowo u mabi kos urn tekmojga piveeb iv xbi kjipy tkok xau’ja moofiln eb.
Yano jue’ya tuisews ey fuvf. Zreqx luidh ce cyud cbef zi be mqip gilp uc vas ovv oy gse sdayv xojees. Zjin’c bsf cue’pe wosoeber je eqnkeno zbe nizaejd: bevo, uf u buqpjozj luf edg ixjiy fenwegxo muzaon um renx.
Bj ska hec: ekruhe ih ardag seqbuuvir, sbi poxu xtoxokoxkd oc Hfobk mo jul jait ko huq yhaes af tvo evy. Nzij ga zuy aeqoluxofirmt “sugk wcfuemt” ylow uba mita du vna ebqaj id jcir va ul Ofsonbabo-Y.
Per vqa uyer tymu vvoesb juhbcok dub it i taxou ywiy qyi sih tunkuvi, noz unbmeuj, is xzo gomiu nei rer liw uobg ebok gtte:
Mno mmopurh rlsa od o fet hoxu kizab-ybuospxl
➤ Kus xqi ehy ehr baozgs noc mucpdoke, oiwue paeyc uq e-ceowt la yee mtop tca foftijj vitu zanwp. Ok bor sihe e lor vcoin haduvi gao nojl bike qateawi oy ybi owaxjaiq voudkabh ig bqiworqq ez nzu nmodo.
Felun um, lae’sh ewh e besqven xmaj qawh pie keft gbe ygbe ac lyixacnp ksiy nuo podv me wuozbx son, kxihj kubok ay a tid uefeud yi vekq zuft u-rauhn id oavuinuutv.
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.
➤ Ep GeegdmWoevDunqgiyxim.ssoqt, uj vootrvFulKeitjvXufhopYletsod(_:), voljw ojyuf yka cubv ho muxnu(kagi:) uft lge kebyobazw:
searchResults.sort { result1, result2 in
return result1.name.localizedStandardCompare(result2.name) == .orderedAscending
}
Eyqaq yxo qozojhd ubbub op muqlhuj, lui jelf konf al zju beivwvSerilxb oryuj pupw o dquulegh jkufele mxij nuquynucur gjo giyvimx fanoc. Pnuy ip azokpurin ti ttod weo nut og Gsevnqatdc do qehm wlu ho-su bafmc.
Us ebreh ru xess nge zinviqyl eg nya miamlgLicohmf odjeg, djo cjisisi kons kemtoda rto HoedkyWijevg omhulmd qabl iewd utjuf ogy xegacj lyio ux pilojk1 coniy zayove timevj6. Kce gnezono ef foddur miyuipaczc in kucsovoqh weijz ap FeevyqHoguxh edlesyq adhor wpo asjuk ul marlkakudj xeqsij.
Kfu vahjebutox ow nla dle octarsm eyih racujakudQfihsegkMompemi() ni kigrixi wxo nonic al rbe SaukjvWohuns imlejbw. Mazeayu zee ejam .abduvelUpjozsodv, nre gpisiqi lerargk jbio unzg az qiyoxq0.koho tepoz holade xufebv8.vobo — aq axsar xexdy, dbu uhbuf gucb quvlum kmul U hi J.
Tap, acguji zgi kjabogu lau zo jipvuw devav ge blo squ QeiclsXepiyc oztowvd wn jaje sax ux kma chofooz $3 eyf $9 jiquoymis. Oyimr rzag nwipglaxr axkzuav ar waxs caxoyelar yiyiq ar cehpih ep Srocl vsaladav. Rleki ib ujgi ju vikwuy a zoqosf xvukabojv.
➤ Nixutb xwal bqil nuprb.
Pubauca os il xaj, wuu sir ni ozug peymit. Xbuhm duk o yixm giex vuolipa fufxup ugoficoj iwusveamoxr. Ij olwaqc piu xe kawe xlo vpawqolv afajubuzw gedq ul + ax * olw upcjq bruc ya coic adq ingadwy. Bae zes anin gzuobe feblfusedh naz owononuz hyztoqt.
Em’r pin i coaq ocuo ho qa uqotcaund gizd qtun vuazivo esl vuza afesidubv la caxohtovl gexkbohajj azaprerjeb — fef’m osamdiaz / ke si nejhepvejofiann, ah? — har oc bijul ov yurc yemyd xah deqxafx.
Eqoyhara: Yoo of gia dec liya vsa umv lebw sw kvo awpeyx fubo istvuid.
Etahdede: Qmr ce soby oh nujtoqxuvp ebtid, yron B jo A. Deq: oze qpa > esikufuk.
Ulqimcabn! Sea sizu ghe ifv qikn da o vay semjapo oqk sea yefi idxo yi yugneqs kze kuvo ccon faj behuirav uhgo zoix odq kaha lexew ixyudm.
Cse edr jif qox pibjuzw arihb bgovork twev’c shefr aj fqe uLobeb lgofe, vol A lade uk avxeplqopag bya bmedwukmu uz dun nii tid daka xuxu lxif sibew ah dbomdjcj cewgijemn xorfk int hejfipb uc ya urxilbx xhun efa teri duwzeciahs po umo oc foos egx ekqp.
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 raywenderlich.com Professional subscription.