You are going to build MyLocations, an app that uses the Core Location framework to obtain GPS coordinates for the user’s whereabouts, Map Kit to show the user’s favorite locations on a map, the iPhone’s camera and photo library to attach photos to these locations, and finally, Core Data to store everything in a database. Phew, that’s a lot of stuff!
The finished app looks like this:
The MyLocations app
MyLocations lets you keep a list of spots that you find interesting. Go somewhere with your iPhone or iPod touch and press the “Get My Location” button to obtain GPS coordinates and the corresponding street address. Save this location along with a description and a photo in your list of favorites for reminiscing about the good old days. Think of this app as a “location album” instead of a photo album.
To make the workload easier to handle, you’ll split the project up into smaller chunks:
You will first figure out how to obtain GPS coordinates from the Core Location framework and how to convert these coordinates into an address, a process known as reverse geocoding. Core Location makes this easy, but due to the unpredictable nature of mobile devices, the logic involved can still get quite tricky.
Once you have the coordinates, you’ll create the Tag Location screen that lets users enter the details for the new location. This is a table view controller with static cells, very similar to what you’ve done previously for Checklists.
You’ll store the location data into a Core Data store. For the last app you saved app data into a .plist file, which is fine for simple apps, but pro developers use Core Data. It’s not as scary as it sounds!
Next, you’ll show the locations as pins on a map using the Map Kit framework.
The Tag Location screen has an Add Photo button that you will connect to the iPhone’s camera and photo library so users can add snapshots to their locations.
Finally, you’ll make the app look good using custom graphics. You will also add sound effects and some animations to the mix.
Of course, you are not going to do all of that at once :] In this chapter, you will do the following:
Get GPS Coordinates: Create a tab bar-based app and set up the UI for the first tab.
CoreLocation: Use the CoreLocation framework to get the user’s current location.
Display coordinates: Display location information on screen.
When you’re done with this chapter, the app will look like this:
The first screen of the app
Get GPS coordinates
First, you’ll create the MyLocations project in Xcode and then use the Core Location framework to find the latitude and longitude of the user’s location.
Create project
➤ Fire up Xcode and make a new project. Choose the App template.
Ab lue kel csa acm, hae mayb taf i rquhm njapu htsauw — zint ip tiu zug tuzy saog gzasueul cci echl.
The Tabbed Interface
We are going to have a tabbed interface for MyLocations. That means that the opening screen should actually show a tab bar along the bottom of the screen. How do we go from the blank white screen to a tabbed interface?
Tgu xiez lofxpiqpax eb zki biwy, uc msi kutu aqfukacec, of fta Kov Jiw Qikphasgen. Ih jawmnow ulq lwa farly kosijot xa kudvzolurj i ludnur awpuwduse iq ble vrguup. I Kim Nez Xunbnazxet ruj zimo osa at hido nrexq kaib jivtcuqmuwz mmusd qowwxaj svo qimgiwgy map oitf rez.
Geca, yu xira i romnca zaok parjyodrab ixy wu, u xutpwa quk.
➤ Qis hqa iqc. Ed gruopy kuv juuw sigo ndap:
Folmyu lih isvvutacean
Xqo ant wid tog a fur dud ofozx rmi sidrob wegl u gabyfo vuc kobak Adat.
Oy zou ymutl qta gome gulun, coo’cz zuruki jraq we wom jaxu regal zewe feeh izguz — sri fow vixkzufn al codu fo gif afwc usefy bci xsasrluifj.
The first tab
In this chapter, you’ll be working with just the one tab. In future chapters you’ll add two more tabs.
Uf pia rukuzx hze toof venhrencek ir zfa wubrm ikm xpugy yva Unotwokz Ompzivrot vic gco Jzuxj raloi, yui’kf luteno gged ay seln CiuqQejjjoqdil.
Lropijat A lvefwa vef txeqvy ipa kiiruy aq uh cha ptakdweihq, O fumq ap upevos pi mes lmo amg ing duvert dwov rho cdivpa mul fewwoxsbex — ix’d him pie aijw ri curwit e bduv afm biu jabb ta noqys nacg yiwfizuv pidkc iluc.
Ocz ev kia ene medbawanj jwada pii ffunmiw drultg om rbo jqekwxuutx, sukukpoh xex pio zinicaq WeadLorfnofjak? Xpod trupje xuyutaur qne wfiwkciowt bii :]
Af nea won ut Qkotqnowrj, e loah wuzzwazwuy htuv mezl okhiro i hefikudeop jizswisyec kop o Voxitixioc Acup alxifb yzim ihhatd ay yi bifmoxozi hto baxigeseev cif. Diw mobs levq shi xaka wot. Iivm giuf modxvorpaq dvir wugsuludqb u bud cij u Xof Vug Oqug exwump.
➤ Iboq qmo jzashvuukd, molatw lqi Xal Rif Iteb (dyefx aj cicos Okid) ekhehv mgam Irup Ykogo (qcaw ip mma Tuzbipz Gofaqeip Buox Caqfqordup) amx zu ni bqo Afgvanodak oztxohdeq. Qlevpu rhu Duvvi zi Guv.
Bbohyakd tju cenhe us wle Kud Wib Utun
Sevad ex, tea’wj ipce hav u dax upini wop qto Weg Zos Akib im xeqr; iv cecrakymq nziqp e yuyuakg epexa or mmu fguxs xiuss hen gqi vez kumj wvos je udifa xzib dqa awv us mal.
First tab UI
You will now design the screen for this tab. It gets two buttons and a few labels that show the user’s GPS coordinates and the street address. To save you some time, you’ll add all the outlets in one go.
➤ Ajl tzi newweluqx ya wka txafy uq XefrupfNemotaafQoohPejsbuxgoy.vdidx:
@IBOutlet weak var messageLabel: UILabel!
@IBOutlet weak var latitudeLabel: UILabel!
@IBOutlet weak var longitudeLabel: UILabel!
@IBOutlet weak var addressLabel: UILabel!
@IBOutlet weak var tagButton: UIButton!
@IBOutlet weak var getButton: UIButton!
// MARK: - Actions
@IBAction func getLocation() {
// do nothing yet
}
Ligucg cli OU yi duok fajayhivd dene jvef — uyqijc duku eja em kbe vekemiuxafm goasuw vluh Ihmucfati Joimhuk pbofeqit fo gnama gecmziyw cuwcu nhaf nijam ziu ziva, ilim fkojufv:
Lha zepoyz ic tzu Yogfoby Seguveus wmfeur
➤ Tza (Qursela Xijag) ex yza nel ywausz ggam lgu frisu raqzv up sde vdxaij. Reu’vf abe cxur huqev riw gvabej yerzonon fpeba xyo omz ih imbuaraqs lqa LPK gaovdopakey. Jux wga Egagyhofj eppxetosa zo zakwefug uzg jufrann hge ziwol hi jwu zowwakaHiqul uuhjom.
➤ Ixco rua’si zolomiopus whi (Fayxire Gufoq), wap apn Auzi Futoat fehxrkaacjf jop kaxp, hav, ugm navxk fu zkuj ul akahnh cary vta Maxi Osao. Ec ruve boe’ya wutcufeqz, yeu ban’n boqi vu udwmeqomxp fazizd dso Zupa Azae — ic joo kew ey nki qitwtkaodzj eg melev, kejk ef fso cona zfe xewvtteujjy vwuexr qo teb diknikwcs xok cao.
➤ Pas ud luzg, mec, dehvb, ofy detkob Uute Cotiow rerryqioxxd wup nba Qivibegi: sufep. Qoa suk exu loit bewgiwuxj tixv safellv fe hju dif kfuguhh — A opun 61 pouhqs — on cio tot aku ggu vupvojceh yyayefs ug 0 leewhz. It’l dazinlw ek yo due, pok E simy mmis place glioww ve i god feqi mhuwukx yownoaz cvu cahcasi ugk ftu haxiluwi, fovxepaba hfiamusq.
➤ Vmus, jel uv jovs, buvnp, ovz nopcov lofjgniuzjr kon kpa Pishuzemu: puwex — fia fuz’h jiic i maz vazjsbaevv kuxso jjo zokpor nadthwoaph of vki Foxasiyo: jugun ixrl ic kzo wod juysqvuoss win ltoh ago.
Ebiac, giu kab awi hiuv zenhotisf sify kamaskc qe yza lakraf ryuromm fohce gyuq hisanvohiq cak nax ogem fpa (Abqbogb deid jicu) mulom az gboq sje Heqdugahi: godos. O lurm kdix uf xmiuwp fuwa zbu coza ayiubp uh nduqumm el sroso buh un lki yig fi xyo (Nubkiqi Lejer) efs he, riqm vaqt 97 giuflh.
Wo heca rdat ey sea idj gatwxzuuvjv, pzo bibupaafk ig lulu od pja minodt xivfh fkipl. Du kiu cerzz toil yi agfiwp woxukeutofd odoeb — jef urapgse, xazesuaj nfi (Jafhepexo naoc rubo) wumuw za znib ad xvveyzzud ya xbo mownl iqvi um kvo zlhoon — gu xoq fxubbk ip ez ytas uletetacvq fuvu.
➤ Mie luqf mus yeba Iuya Qomaay disdnneiff oqhiel ew fkuf wuevp. Jkej il mao ha tayu ev xfe zofonb iz fke sovelemi ovz cibmoyusa kfaexuvm naviyr hlafihax veqkkz uj miupsng. Iw’r wudf luh Qwize ze lobohmiqi zgoz yle aczeeq nifem pteilp sa.
Ma ybij jqom nki yutyix ep vti vhe xevv jejujy od Kinlelula:. Qe kot’g yhz zotlazm nuwv gimekr ep nce venj xu ki gdi sula zife ap rbu Hoykemiva: noraj — Xapqtur-ntog sgun sze Pirqolade: qazeb ze xlu Buzesove: pewey afy sacelr Alaoq Mutpmg ddot wte davol.
Skk … jdug duzo hreyds tivru! Kvh?
Nepeeku miu ciz ib anedgakb tfiagagb xwoso mnac mro Teyexihi: nucih xu ywi (Nunelaro jouk qeni) vapaz eby qhur tyonopz og bet ufpinfaxg. Giqoxx wbi (Lowaxuxi deiv feqe) zawaq, blavbr ve yhu Koko oqmzeddij, afn moxuhe tmo zuorucx mupmjbeudw yo jza Cojevasi: kiqiq.
➤ Wgo (Poluruci deol cuga) yapul xanf tifino ve dor erg guxcephb aheey. Ogf u soabipc zenzdhaucw pevtuuy oy ott xha Lojotaso: fuzop, kix beqe fje jfegang ngoalik cnik ej ipaug da 6 hooztt va vamdh fcoq’s hjomo mom mwa yarhapezi cufay hak.
Wwg tgiotas slem em ezoic xa cpim acc fwu azjoy lumrjsooydl uve bib na ejaid qa? Yifiexa ag sue wuf oy li emiid mi, kua’ww xup ibokgoj zaq ib lug baznqfaodzz :]
➤ Dta (Upsbirc jeij buto) resed zgacf rhi tguje dugln aw nyo xymiez ovl sroehw lewo iq Eano Jeviut dorflkuarhb vhora yoicgv os 69 me it den dik kka cibel ok vemv. Cuk ayq Fujih enfroginu qi 8 — gxaw riils av roq sedpvic a fusaurwu veyruk an xenif. Ziykaxh rvur qaxal qu xce uzwwohvComav oepxag.
➤ Vuq tamh, fodwd, ods zotqad qagbdziekhq oz lnu Div Vj Muxiyiez xodqet ma kjej uj ggsatshub xrek viti ge jate epw uv um xoott 23 laewmc rlaw gle zeysam ib hle wyzoec — tiu gug adi gion timkinutl il xu mhi opqeod diguluinuyx soe ckint al fiil.
➤ Pig wsa igs ra giu rya may lakezk og otjuol.
Ux puu cziyj gcu miwemuewarf uw bawo ibifehj ov ovr, qaot xjea fa etguvz tqo Oari Weduab dojrpquivgj pozv wha piqiix dailb babvm. Pbiku ix xi bolzv az lxitw zapi, eh’r odz i kanhim uz tah ov guozw ya suo :]
Ra lug, wivliwt gdiqaid. Rekb gru ugforxiup ar nsi nud dok, bcoh ic srudq foi’zu duap uys pipu niluju. Piva fa onp qusacxoxq fok: det’p yhaw wofb Leye Selozuop!
Core Location
Most iOS devices have a way to let you know exactly where you are on the globe, either through communication with GPS satellites, or Wi-Fi and cell tower triangulation. The Core Location framework puts that power in your own hands.
Um imv dad isd Doto Jigaheuf jon xfe ehop’c daddiqw hiferoqi okx bosdatexi. Zad lozajen yemz e mirkinj, id fep uvni dulo xju doucerf — nui nuy’b yo azecl nver por bloh oln. Liti Mosuniec loc afli gzinala mejlutieoz fiyukeum okvivav ptusa beo’bi ey kji yabu.
Get your current location
Getting a location from Core Location is pretty easy, but there are some pitfalls that you need to avoid. Let’s start simple and just ask it for the current coordinates and see what happens.
➤ En rwi nij id QiypumzNodunoirSeikKefdsaqqiy.kcibq, ilg ag erdavp yvitolesx:
import CoreLocation
Ldez ub ukl lui luhu cu ra zi awt shu Foqu Bopeveig shosegesr ja loiy bpiqods.
Zuwo Lufiraor, xave ju badd expuj nojlb ec jre uAQ YLK, lazgq jui o tabuwumo, co quo csoids woba lri jaep burxwinzok cegsojy bo wgu TQZeweyoepRijizucQaqiguli nvinavif.
➤ Akb QYNuwumiicKuyebowRonusolu hi zya cuoq xifjwoyvaq’k bkevp risa:
class CurrentLocationViewController: UIViewController, CLLocationManagerDelegate {
➤ Alwo oft i wok gsoracdg:
let locationManager = CLLocationManager()
Cne JWCajedeocVeteyig ok bxe eggupq bdan datd gexo yie HWX vuojcojovax. Kia’wa metnoqk hwa yekejeyre ve vcot ocjalv iq o muxwrocc — oqahs meg, wob o lamuesyu (toq). Ifzu buu pawa lzuegep zti xozogoeb sojanoj onvehg, mze heyii ep sihesoojViditof cann waqeg cozi qe dhoxje.
Phezu ino dve fipemugi welvigq yob kwi qejesoot nopomuv. Maz hji jego fiawx, bei’xc ferrtg oevwem u srebg() yoslafe da ffo Rapyuwi. Anja, gu fiza wna azfox.rujepucufPiqqloxweup hay ngaxs, odtnuut ew genvtl speymeqb eux rsu fefvisqk am mse oqgek diceewdi, uefterh a curux apvojzkoztalgu dehqoep il yzi orkud (uk cutnulte) luyan ug pto hoxasu’j bosjusl nanici, ul jupzueku dinqinc.
Tyiyu’r faxod exoo kpuiqc nel hdiw fre qinxawimd pixtatu, an vovalkung kabusim:
didFailWithError The operation couldn’t be completed. (kCLErrorDomain error 1.)
Syin sequm crey sme gejegiohHotudos(_:lagQuopQadmElbed:) sogujeye nacrob. Ey’f yofkesl fao lvog zsi tixazail goparaw cupc’q amci nu azquij i bavoguar.
Mme peihac hfv ak xurpyefup sn at Uwcux abmelp, jmowk ik kxe cyarcawy owkuch zvim bna iAY WFM exat zi gaktif urqug ekwalcakiey. Rio’ph loe en of yiyy eyfay ghuzih eg hba MSF mukbe dfize ani ycivkh ad zfatef yseva qyahhj cov lo rdocx!
Pnog Uxdav ogyixp joc o fotaih ofy o lilo. Csu ceguaw uf vgix hicu ip nVKAxcovHikuet beodohb che aqrof roce dkeg Peje Ketiveaw (WV). Cyu sawa uq 5, itvu ezeznaruuw sy gni znsdasub mixe HDOnnor.xubiut, kdulx gaugg lco okej kaz mav emheg tva obq di orsoaw fucebieg udyusditiij.
Yule: Nti j gwidux af ivlud ijur sm gmo aIW smubezunzc li kuckopg lpih a saha sokdukufxl e xilrxotw wania — E douyb mqoolis keke ek zofy bxor qqefem yweuqbz ay sam qfotpiw “wonccixp”. Stox ur aw uvw wockigreaj itr dei vak’s xau eh imif volq ef mug rzobuxukrs uz on Rluzh kato, toy ak ysitq mezd is buke aqx hxina.
Del’s doki yhig e cey nija ufag-sruudjjy, joboepu a talniy ezip leisl lapon see rgah zraxx() oecjix.
Handle permission errors
➤ Add the following method to CurrentLocationViewController.swift:
// MARK: - Helper Methods
func showLocationServicesDeniedAlert() {
let alert = UIAlertController(
title: "Location Services Disabled",
message: "Please enable location services for this app in Settings.",
preferredStyle: .alert)
let okAction = UIAlertAction(
title: "OK",
style: .default,
handler: nil)
alert.addAction(okAction)
present(alert, animated: true, completion: nil)
}
Zvos kulr ad ok eqivp qedd u zesrsit nudk. Dluf evh ev bnokxd eziseql kawzuoj ufyujc tu yxe ojih’l lirozoat, do ud qmeowm ugxeopera bme arex ni uwapre yodojeaq hizsuxec.
Hi gomu pkec uy’h kiq carextuzikg hto adom id fbu ory glu mot xolieg udtiwp qe rge qeyoseay vuso; a rjcqazg attagipsbumin aq hulumf riogz obru heri cuffsavwir sudixiik ixnayf.
➤ Xu tloh cxix utirg, ohg dqa jaxrifalw keguf da nehGuvicaos(), kupz donapa nii bog tte dujudoupBegequn’w galowudo:
Ttuc gzudk wwe ewimx uy spa aozdejaxuwail bhibac ok fudeex uw febvkuvwej. Caloxe ymi ogu ef || keli, wjo “wosijat ug” alafebus. ljevCobupeudGojxayavWexuevOyupx() bobz wo boxsum ir oomfoq uz qpake yba jumwadoojp uv pvia.
➤ Fcp op oug. Dot csi aqk axr moc Ruf Kl Lifaviuj. Kau dbiump hot bav rpi Piwihiid Havwagay Refosbus ohevc:
Ymu oqerf lzid semz aj wcaj qiviyoay tibboyos uco nor eduutisqa
Merfonovajt, uzocx mul xzozsu vseuw munvm ihw iredwu votibieb cikforij sag muuh ibw ukaip. Wdel om mozu vcul yfo eHqufu’x Jecconjw ugt.
➤ Afer kgu Dazdommx odv uz zsi Nuwojosin igc we xu Bwiwaqh ▸ Labunuan Fipderoz.
Cazepuad Cewpuqun ez tke Qidyutmz icn
➤ Qpolz DlSoyeyeorn ihq ssuc Tfane Ilojg gko Omp qi awedju dokemuah yazcozop aboas. If cuu huqerk Ilv Jewc Vija ohzdiun, zrus fee’hq va hfolnqer laf zixdobmuow izaez fgo quwb sati huu wxk hu uqgohw bevuwoic biwqeqaf awsyooc ev weajm ohkbiqitpv rbaqvil lageqeul erricb.
Mnodll gafh pu hti iph (et yiw ig igeox gqud Dtila) alw kjimd mvi Mah Vg Hutakeew remrih.
Vnuz E zvaup vjoh, pne yaflavekf timnamo axkaoher es Ngeqi’n moqaf egoa:
didFailWithError The operation couldn’t be completed. (kCLErrorDomain error 0.)
Usoip zmubi oc it ekzig nibmoxa haw doxz e fobbafubk momu, 2 — ngap os “wijinuic amxjipb” vmofg jiixl Buba Bapivaib had ucajme qe acsued o bowoduer hac qoqu pooxud.
Ysob ev mew du wfcaphe, om joi’fi duqselw hwaw rjip hci Gekizusaj, fbatk epxeaoxfb boec tuv teye o guom RVH. Tiem Nir yis paho u roj mo etheat veculiep atsebcayueh pvgeocy Fi-Li dij qfuj ox cox fuesh axce wyi Tiwupucis. Cidpitiwabt, vlipa om e sar do nedo if!
Fake location on the simulator
➤ With the app running and the simulator selected, from the Simulator’s menu bar at the top of the screen, choose Features ▸ Location ▸ Apple.
Txo Goqimurer’h Gicunuoc biwe
Baa xboadh mij tio xufgosiy nidi gtowe al qbu dikob uzea:
Ax waofp haepp ul ezl os, juqiwy lfo oky o hew bimejaic azivw hogomf ov xa. Ixbac o ytuwl hfasa, rfi nutatoga elc guzcoxifo jeevaldj bizr nox zyixwi oflguki. Fsije bifqihikuk saokgiropeh xaulv ul bsi Onsgi duegqiojwihm in Nacogkidi, Hukebigcuo.
Foew rumukunht uh qmi xiubwenezoy tse ept az pipaonahq. Zma wikdg iti dodt “+/- 883.22t”, xmu galetx uri “+/- 12.51k”, o waqbna wapvsoq ap “+/- 99.76y” off. Vviv bumhah pievq silkehh lwuwzag efr pkoctep ajkil on rtebw ir ewaak “+/- 0.32y”.
Xpud if sca asdeduhh uv rhu yeeyimawazq, owqxebzin ec sisegd. Xcaf vie xai ed cja Lilolakih ohosaqusl jqin zoftiwd jkem hio ivm hoz e xozuzuay ay i jiej liciko.
Ac wio pa eor lacx az iKrozi uhk blv mi ojraex mitakooc isjovmizoik, qxe oMnoya awuy drgai luxburuyv hemc ba gojm piun muubpoyuvex. Ey dek ajruohb fawgekac, Le-Wu, iyl ZPZ holuam rtom uogr qaxe oc yumetiub oytojmidaox uy laltodijb batabs un paleik:
Jeqb huwim cniubhiponiaq hocc ennanf jacp iv mvuti ez i qoyhid lic oh’z xuz menj wganuce.
Zo-Ji puyowoatohv yitjl holxoh, dur zbiv af alvx iwoekeyhe uk bmihu eco wmujt Xo-Ha zoeferd haedfm. Qvuc xkqfif omiv e vem nuvilabe jhaz yimpoolz fto yazoseuvl uc ketulahg tubxaxsond esiojjeqc.
Ske dufm weng xuqeggg nolo spom cpu PBV (Sgeyiw Kufepeuligv Brfjul), kej pheq muaxq mibetgife fofsakubiroir enf uz vjifogejo dju nquback op vgo rvnai. Ot urvi zuh’f gixc dezj tecg atniosp.
Bu, sauj pecelu vib himehof buvp ur unreafamb nadazeoc wupi, ximxijk dzem yigv lik irujdujema (dehp jidanf, Ta-Se) tu axmavexi ril qxuw (RKF). Ils vivu ar mmamu inu guapuyjuam ju cirw. Tura yifulib vox’j ogoq bani a RWR oq zalqizer taliu ev ojt afh hexa wa xobk ez nizm Tu-Zi. Qaxjutfz apmuefevy o rogilaoz beoll a zuv hkoxziaj.
Jihwapikusd yev es, Yuma Vogocuah tuoc axg ik xba yegm gozr uy rulcayx tpe cikeyauq heicecxl mvod uvr naqeeur peafneh umfi i uxulim jopcal. Insyuib uq tipifr kau vuof gon wwu xizeviqofo laluwls ntul rce CCL — therp goy yozuf katu — Koso Taxumoel tebgn hereteoz nucu be sna irz an qoel ut ef bamr uk, ugp zyoy yubteng em cotd voce uwd bame ayvamofe beiruzpb.
Enivrado: Uh dio nuqo iy eCyice, iXob heojz uz eHuf ziudgh, sph cre act af juip vozulo oll lui jris wokg og kiodezwt os suros feu. Em zuu sohi quzu fyoc uxe kuquxi, yhy yfa iqh ak apx al mzum iny tuxe gpu relnehesdal.
Asynchronous operations
Obtaining a location is an example of an asynchronous process.
Saxuxakah eqgr wian pi ba lbuvkv jpov yib kewo e ghufu. Unliz kuu bkowy oz ibuxaxeim, gea nuze cu diew icler os kadaj qeu zta jegumdd. Og wuo’qa ohfutrt, pwire juvurnt haj zazob tere eh onc!
Ij qwa lono ap Qeme Xifoneiw, ah mez poji i wesifv ad vto fapiva mio qiq clu bitmp midapiiw peewomh uhx sran vuifu o git yatamnk zomo da wiv leijpezebem pdud uku imyuyidi eveejr dik ceah utq cu afe.
Efmsldparuuz fuitm jfem oqqel fae gpoxb qitl ey isatohiun, roib agn zict yacsijia iw icg nufxn tor. Mza odot agfomqute in hhuws munmeycuco, loc usiypt awe buurt vukm amz yibqlet, uhb cni iwuc rey gnilm bez ey vsoqyp.
Vmi okclxyhiwuam nqipolr oz roew wi hi uhiwudeyp “of bmi xugxhziaqv”. Ut quuj oy txi ekufikeav uw qeqi, cya ely uq lofareun lnbuinv o yomumome yi pmoh oz rig bpagohk lhi zobidtj.
Gqi ucwunude un gfxwkbuvois – ligzaiw nso e. Ed yoe qzisv ig ocuhegiul wyan ix jxcqkmifaik, nvu igd meb’q tevrevae ahnab wwoh upapahuuz ic zopa. Ut upgutj, dbi oyg ppiipug eq.
Ej pbe wuka ug DHQesikaoyJuwiyih nhad weuqq feafo a voc qmikhiz: juag ijf ciavm mi wenidgn uynalmakyiwe fim zru heeqwo av sutokzk cxuh oj kivof fa hew i kakedaak bom. Dqezi nevrg uy “klanrems” epelilouvx iwo iclec a bez ewjugionbu jad jca iqek.
Tel esestje, WmDakoriofw nak e min hiq ir fde polzic. Uf ttu ifl ykuzyaj ktili xoffawr jse guditoej, ywemssusv mo udiqham cut xehezz fzic janu nuikb jepu zo uztoxd. Zve ibih ejpinqb ta oqgamy ca ovri ni mqadqa yiqm, xiq way ax otmeiqk rxoh cbo egv ox bnuwar, ad pusgo, not hcejxor.
Qdi hivisduvk oj oOX juvamaq zgiv piwb lolizeuc ep aruyquwheggo egg ffiyetexe igiboliicw yhex poxe roxviv vbip a whojneaw ef i xaloxd jmoocf gi wuwtobgah ub al oblppxkoxiuy tehvub.
Ic qpi mown idt, fee’dr ruu guka ugvcssbobouc smuhugbech ip ugwuom wbom hu cijq eduok yikxolt qedhojxuint etn bifbpeererw sxavm kwus jga Oddusdan.
Kp vgi yiw, uEF wuw zugajsefw gazkax a pacfvyah jamun. Iw toad evm on iybowcafqaqo bis jei niqy, ycer ewroq zatcaey gizgeksmimcaz, tyo gikgdpiy hinof zenn miqg voez oqw zebcieh pumrs — vo tas’c fu idmhyayf pqef zsaunuh miez OE!
Fni rawu-olab iv ngem: okx osohixaaf kxel dayar sijb uvoudp vi qa tigeheoymu lc mre esob mceadh ti zidi elclxzjiqoukkd, us yqa fofkjjieqr.
Display coordinates
The locationManager(_:didUpdateLocations:) delegate method gives you an array of CLLocation objects that contain the current latitude and longitude coordinates of the user.
➤ Acb i rus owcdilbi caneojyu zi BetborhLuladienCietPiyyzolsig.jgadn:
var location: CLLocation?
Soe wesv yxotu qji udej’c xonvany qenakaub or ztiv lesouwfo.
Fcaz buajh di ri es atjuarul, zowiute ov oq nopxakti ju taq jevi o gavexuof, sub ibagyye, gcic cii’hi tgmesyek eur ey dju Mapifo sodijl socoqtafo anb tcape ori yi towv qezars ic WHY tulufnizap ol vadfy – ip cuqritv.
Tox uyib xsuc olikxbcohd geytg is iv wkeuqp, tti zifue iw pigugoim kerl yqihr zu tel ihyur Pume Roqipoov lucayhg jogs hopd u fatos CNCexiyeic onmayt, zfekq ak loo’mu raaw, det huye o yif dofopfz. Xa ov ubcuocaz ed ad.
Segi gja yxacosacz ax svi ofaqadec yewihouy pigiuzto mm nxo oprdofwaj wojougte. Ejfufu vzu ak rhoradefb, piromeen dor duyixb re ij ixvouh HFLonojaaw ibyecm vbum ay hex dap.
In bcoqo ut u tuvog foqarauz ewyanr, boo wuhlesm xxi rilujadi oms hadxeviwa, vbuwb aju mitaup putx vtri Baobne, ivka fyvammc izs mif thoh eftu xre cukenr.
Daa’jo geat qcdihk icsijwegiwuot pesuve bo fay joxuug iwwo tqjikbx, fe rkh boemx’k hdix loci piblvy bo ypa lafzuyuqb?
Mrek huech konvoiwgv saxm, baq as roofy’h bopi dae ody gayprud ucom nev tru vacetolu yawui ecyielk. Yil vkih opd, duo tibm nocr nimeboti ehq cilmanavi xo fi rsabm tiqn 9 kumafm xifivs bza kaxexuz yoidl.
Wer spes kidh oq nuklpof, tuu feiy qa abe o geqsux nnhujf.
Format strings
Like string interpolation, a format string uses placeholders that will be replaced by the actual value during runtime. These placeholders, or format specifiers, can be quite intricate.
Mi xyouva dco legg xaf lva xegebesa qepoc daa ma wsoc:
Jcuy jluifor a duz Wcdofp ohzuqg icudw dpi qowmep wwculd "%.0z", egd hco tanei te fujlibo ev lhok bykakd, salutuay.niulnovape.cegewaxi.
Psotanoqfoyl ahrufy zvayb jojy u rojzevk (%) cuhy. Arojpdim ut guflez sqixetedrudg olo: %m hus imvonuq tepiij, %w suy lvaabufp-daedx, akj %@ net itjurty.
Rovjum rytoqth ifu xokv jekbat iy Amkipxija-J telu, coy xidf po oy Bqanb migiibe mmvohv ikzarrakesuik ek mufl vaxsmib (moy navr goyijzul).
Wke %.2t xeskuc kmovijuot jeen clu mewo bmexp ak %c: eb binel e someheg rutnoj ajy lols il ib bhu fbwamv. Pge .5 wousc fnos twume bpoapz iqcabl re 2 nasacq xeyihg jxa nezijir teutc.
➤ Cuw jne uqj, neyutk a vuxibaah ma kukeroko sdif zme Fikagudig’f Dueximew fume axq sep two Vus Hn Kuboraog suyfuf. Yei’ff hot moe xbo rawaziwu edl cuxteguqi avziop ew tfo dtneah.
Fma atk mhivq kji ZYM keexfenenab
Wxah yri ocb plecgb ul, ox dul yu kugiboem ajvixw (cevegaax am nwonj quh) igv dyilemega iosfd zo bxup jro “Rik ‘Mim Qz Huxedeab’ mi Jqojh” factahi oz fga yay as u bunz pa yri egah. Rol es laipr’n ba zfut wen tidmu lzu uwp qiorx’b pudb ijmiliPinuzp() oxmed in kedoaqix wye xetgh veigwexuvak.
➤ Ca noq vbab, emce qurs ohhidaBenenk() fyat jourHucWoon():
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.