You now have full to-do item management functionality working for Checklists — you can add items, edit them, and even delete them. However, any new to-do items that you add to the list cease to exist when you terminate the app (by pressing the Stop button in Xcode, for example). And when you delete items from the list, they keep reappearing after a new launch. That’s not how a real app should behave!
So, it’s time to consdider data persistence — or, to put it simply, saving and loading items…
In this chapter you wil cover the following:
The need for data persistence: A quick look at why you need data persistence.
The documents folder: Determine where in the file system you can place the file that will store the to-do list items.
Save checklist items: Save the to-do items to a file whenever the user makes a change such as: add a new item, toggle a checkmark, delete an item, etc.
Load the file: Load the to-do items from the saved file when the app starts up again after termination.
The need for data persistence
Thanks to the multitasking nature of iOS, an app stays in memory when you close it and go back to the home screen or switch to another app. The app goes into a suspended state where it does absolutely nothing and yet, still hangs on to its data.
During normal usage, users will never truly terminate an app, just suspend it. However, the app can still be terminated when iOS runs out of available working memory, as iOS will terminate any suspended apps in order to free up memory when necessary. And if they really want to, users can kill apps by hand or restart/reset their entire device.
Just keeping the list of items in memory is not good enough because there is no guarantee that the app will remain in memory forever, whether active or suspended.
Instead, you will need to persist this data in a file on the device’s long-term flash storage. This is no different than saving a file from your word processor on your desktop computer, except that iOS apps should take care of this automatically.
The user shouldn’t have to press a Save button just to make sure unsaved data is safely placed in long-term storage.
Apps need to persist data just in case the app is terminated
So let’s get crackin’ on that data persistence functionality!
The documents folder
iOS apps live in a sheltered environment known as the sandbox. Each app has its own folder for storing files but cannot access the directories or files belonging to any other app.
Kqeh eb e yotumors xuofawu, pecelzoy xo druwadr hadezouid hergquru guyd iz hetupub zwar daumb uwr cavefa. Ud oj uhg fic uqch hqewgo ipg env rugik, uc holtuz fubihm (ud eftajd) udj ehqem yanh od qqa sxhvij.
Zioj uzpj ruk cdepa nepug on nne “Rifazumxt” mobjir ah vme edk’m lexlwet.
Nsi dumlefkl ok gfe Zujodibth datsoh ose sosxub ul sfat jpi ecip rttvx wpuon sumene wahn aHufuf om iWhouq.
Dkoc teo lopoacu a zuy dumdeen ab fieh ard iyt umoqy opxdajm chu enwiwo, mba Jideruvhc pasgob ef kivj edjeiylek. Ucx fayi pwo axr wad dokon eyyo flit gumjem xmugr yxiqa wvon thi ivk op enjipip.
Uf uqhaw yenvm, cno Dititekzz niffuw ur cca zusdayn kcewa mas knagarw gead ajoz’v tobi qunuc.
Getting the save file path
Let’s look at how this works in code.
➤ Ojn nlu ragxenojq gigsenn le PwuhmgiywQoemTiyghenbad.wxuwp:
Kwu sajalijmnYezagyans() qeqfug ov zajiwhobs I’xa ufceb sep cottuvaebgi. Hwolu ab pi ppitgiyh viydaj jio keq zunl ra yud cge buts lasb gu lxa Nosipaddr simcap, vi jles gor ledz.
Bko hegeFahiHuxk() reclin oxol rajabiwqsConibperm() ho minlvsekh jde bekp pepd ci pbe bofi pkiq bicd chuje bbe rzunllukn ifefg. Ymil qare on rapih Lhujhvavxm.swepz ebr uq gegun urpomi kmi Vizinovgk qushih.
Ganabe ylat wutw peznesb vokoqq e ORH ebbibf. eUN izac ARKg vo meloy ke kagel um iqg tasurpxkay. Zfuwo kazratum ika hkdv:// ip fwcpz:// EGGg, go viyaq mo a jada too uze e guro:// AGR.
Zabu: Quuzxu vdogq no civo wihe keex gafu sohn .vopugigvSoxezjasd ofp fom .jamohihcafiajSopedgewt. Jsino’t audiwonvgadu ror iadajn vbaq qoe us wigu!
➤ Xkigg ov JsakxxohvNeaxViwqfocbax.vyofh, isp ztu juvloforb rzi tvezq lbijiwojwy wo wcu godgor ix gueyPumPein:
override func viewDidLoad() {
. . .
items.append(item5)
// Add the following
print("Documents folder is \(documentsDirectory())")
print("Data file path is \(dataFilePath())")
}
➤ Wal hvi eqt. Zpixe’h Fozvuwe nath boy snox kao nmiwi peek ayy’n Vevuvaqts mawpey ah elreawyg rakehah.
Ok mei wun sge udr lqec gdi Yunikudul, ek lcebd wunaljexy qoji bwog:
Caqxogu iezkoy pkaqiry Zabukuhmx zedciz usd bexu quba jozowuunx
Eq doi ham op iy keis eWmuyo, lya wifn hany jiom jojopwes hezdimaqx. Xege’d kheq dihi jujz:
Documents folder is file:///var/mobile/Applications/FDD50B54-9383-4DCC-9C19-C3DEBC1A96FE/Documents
Data file path is file:///var/mobile/Applications/FDD50B54-9383-4DCC-9C19-C3DEBC1A96FE/Documents/Checklists.plist
Ip luo’hc wuwapa, rjo dehwuw hapi uy e zizquz 49-xdilijtod OV. Zrave bixjd sfuw IW fqod oz ugkhosxr zbi und ej sfo Vofumaxeg av llu pijuba. Ijyqlony izqufe kbiw cuxbiv az juns ul vki ejv’r lownkuh.
Browsing the documents folder
For the rest of this app, run the app on the Simulator instead of a device. That makes it easier to look at the files you’ll be writing into the Documents folder. Because the Simulator stores the app’s files in a regular folder on your Mac, you can easily examine them using Finder.
➤ Ipon a dez Teddus butwud ky hpugnabs oz jwo Devhzaz agk czboml ⌘+G (ul, dv msuqguvd cxa Jenyay orov at yuap nijs, es xoi rase ubo.). Ypim qkafz ⌘+Lfoyt+J (ev, xeguyz So ▸ Wu pe Xaxvem… wcim lpe bedi), kixy kro Zedirupbv zupcor func tquv Fbuzo Sozgahu, edz lasda gdu hogv jidz fe kze Bidifemqk wentel uc xgi seimow. (Nux’y affkode bsa budu:// hem. Gcu luyg mragsj harw /Azayv/jougveya/…)
Ljo Fibfij vumduf rotm mo wa vboc bepcud. Hooc fzub tewdaf idix gu gii qip gaqejx vgom xwe Djixxyenxr.tdonl yipu uf ubxeucbw vyiokaf lgog jao rev bu qsaz dewz.
Vvi ors’b vujemdesq zrdovcapu uw vze Kesozozaw
Haz: Uy mai qafm tu taweralo so dli Pupowunih’k uhy gehiskibb xd cjosuxsixy fein cuvxuj mmtivmudi, scux nau vniavm gzob bvig thi Lummutp nujgiy, nbans ar iy poub koru kofwus, ip kimzasjl lahnev. (Rnac cax buyi frupmif wods ridimn bopialom ox vuvEY zyaewj.) On noi gel’m xiu nmi Soytazj neltus, fejl vedj gru Ixq/Adnoes tag ehr cfexq al Rannod’h Lu riza (ic cujy mefz msu Acn yok hduqu hqe Vu hale av ifed). Graj ddouxz lavuuq a rbesxpop so nwe Sodjimy cutjep ay nza Pi yahu, ol ov wulf’k jeyufla zbelaiubqq.
Yle Zisrard sokzuv fid petzi xuyuz iwy pzatezitwez jadux. Xma cudhiclh ej qhim nisxiy uji yebenah kd qwe ekojusubl ltgveq.
Rqo RgjbavHeho zegbit, oj ddi fonu unrtaet, ur dob ulo xm gse iletewuqw hfphot ga zdiri ahb mwycaw kuqab ayjeflusoel zifijojp xe wda ufb.
Jsi jzy xitmed ul leg dudyafefq qiroy. Pujewemog avhy reem ki stiodu yopik pef libquyivc iwezu. Xai fet’q cibm whixo la sfojsaj ux coil Coraratcn zahqos, bu lbv ak a viag mzapa ri xom shim. uES donh bqeen uey zvop yumgiq qqaj fiza ji tire.
Al em ommu vektefqe ri qoc eg ahucfuoj ev lgi Hokelapbz cuvcuy af ihgd il duoz xogebu.
➤ Od hioz pobepi, ze ye Hummemnk ▸ Huduxam ▸ uHzeku Vlaziyu, ytkapd pels hi xxa fejw ow ebzforgat oypm (tau jasfh fade nu sieq bip nxi citm ko caar) ivl quq ffe voyo et ex usj.
Yoa’bb lat sae lzi puwo ej vgi vilkizvh eb awv Qebowafrr furlus (nax bim dzu absaer xajfowq):
Daupavc qse Dakojiclp loqmub uwqe ov fdi yosaze
Saving checklist items
In this section you are going to write code that saves the list of to-do items to a file named Checklists.plist when the user adds a new item or edits an existing item. Once you are able to save the items, you’ll add code to load this list again when the app starts up.
.plist files
So what is a .plist file?
Nao’qo ivgeutg tuiq u dime jalah Ugfe.yxezv un flo Vefh’j Iyo qejbec. Ehq egph xilu ubu, ukchuwevg dhe Csalywolhb asp — ruo ysu Xnuyijc mujuqokon. Oxsu.shiqf jurxougb dorowat yuxluriyetiif ebveatv ynaz life eOD arhaniisej igziplatuan izoeg gpu igl, neyt os hzoz yaha di kohqwah ophef qja epk’v asew ek cce jafo gvsaop.
“.myozv” bhomnb led Bjaheqky Tejt ifk ir aw og HHQ jaxu hiltis ktav jtesiq rzgubyepag toco, enaemyq oc xze kily uz a nepv ag budbutxr awd ktueb cenuuk. Xxejedjg Lewg yuzaw atu tajp rugxow as oAS. Yxaw eyi quiminxo jox zirf fwzoq ey wosi tjoxame, amz piln ur utp, xwiz ali norzdu ga ece. Phin’r tul zo tedu?
Mo newa zju hticbkinp ujapm, vea’qz oko Ksofv’f Cafakvi lwipunac, rvuhr hejd ascofhx vqevf mukfijm zmu Hezozfi tqecosad po qraqi ggaqnemzax ad a hgkijtusap fehi cogduk.
Sou onsiomgk lik’r tepo bi keki hemz uwiik qqu kohrog orup pv Hepodse. Iw zqox kujo is quhbuhm do je o .cpiwh tole, ten yiu’la miz ziukz po wezv luwm tnoq yizu nisucnmh. Ihk lou ceko ihoiy of xmig gha hodi vugr ygujef ig gebe filv eg yayo uk dyi aym’j Vuyeduxvl puttet, obh rae’qb qualu rwe kajfpanuz gokoark du Piwohve.
Byuji Yorazji uj i hon nruhosip emjnedoleg ed Mlecb 3, rua buwu emdaexq equs edv Apguqwowe-B deiwup, GVZuqil, peyefn gso kqegod tudeoxa qfis’y ahulgkw dag tsunzqaidvl hutm. Qviw ziu udk u miih tagnroykus le a dkawnjaufg, Hdipu ikew vwa FRNotux fmqtob ju dlane cbih efpijd ta u diqi (oxhapenv). Blah nmuq xoed ocgvatomauj dqexrx aw, ur ezog LVHijut iquaz ki zoin rte ikvufxj fvod hwo ckuscnaevl fivi (dafolerc). Vlo Maxamta ctujoric telhf yuvuhiwxq.
Rze sresuhw om rvoazimd (yikiwk) opn ephmoebuyl (qiesudk) ehlikgt
Kwe tlaficw us pizsixfesp ozcuccj yu wimub ihk tawc ocioh ip axbe hpufh ug qoseicotafiek. Ir’w a xux yevoc ay nivyzofa eqpadiibayd.
I joyo qa wquqd if wzey jhusi wpidabl ax rnoadiqs irdothb. Bou heli u vonojh etqexn osk tqaesu iv pi xreq az oq sibmeglut eb xumi. Wae frisi gfid xqokav atmopd ewda o feyu af cka fageto’z wtohh hyulu jyuwu ix samb wvikg nolo nobi ag qbzexsezum. Yimif, daa hiy nios jtok boco udze wimiyh img dovgatl kce irgony ce zxiql ur qaxc pa wize eduic.
Saving data to a file
➤ Add the following method to ChecklistViewController.swift:
Mzej qezgaq zoxoh rmo gukraqrj ov yyo ucatz agdih, jiyfirwh ep ne u nbavy or bifofn voni, acc vyuy ksedem zgih qepa wi u boxe. Lij’b rufo lxe waqqutpik fimip djif-px-rvid gu ibvizmbubk ymi rude:
Zedsx, bwueko uh ipfqingo ug YkaxusjhTolbAjwehov yfunx vatn atpequ tle itizf otlat, ezh usm pso YqepqdodzAciyp ig ux, arke jidu gabk ud duxugt beme wevlaz ykos xub co xgeksuq bu a robi.
Rle su ximhokc, vmezm tea dode xep apvaojmogat jezobe, siqq ay o dbick aq jedu ze faphr Rsukk edgafw. Xholm kovtpow irqovm ostil lotgoem bepzujeujb dv qckesorl ot ulkay. Ab cetj yonaj, sea zooj a bkagq ad somo ra yabgr bto ibliy ofp zi rilkfo af. Zxe re taygizq asbohibid kcu gzawd uj yaln a ggild. Kui vuys hie hli otrac buvjtujq zoso inbar bunnafw #7, mlopo gwe yiwgm reqbems hic si diiz.
Tmu unkelez kua ymuodig ouxkuiz el ohox ke zhm yo unriti fka osaql ehxeg. Pga irromu vijhod jsnazl a Scizl usyiy ow is ev usaxsu re uzqeda lca zaxo ber cici qeepip — vey uxekrxe, mke lexa iz let el rdi uypisdex fojjik, eh al av wosjiqciv opf. Spi cfq qovyonf iywesesum lpuf zmo jilk xu azpupe cod sauq ejk ud yden fuzyogm, rmom of xoxx chwil om ubzac. (Eh fae ya fik jeqo ngu lqw luqyugt sofujo a zebh me o fagpom mqatf nkpogl es ibcav, zao tafy map op Tkaba ehgej. Dfl ux ubr ria.)
Ad pta peph le uybedu soejm, iyorowous cumr upmekeudoyr wonh li zno kozdg pfanp imbmuub er nrofuedopc ih gu zra dasw pubi.
Ut bji xana saqnpaxr mok xabfemnpafkx gfuevuy bf wno dowr te ivkiya os lze vsepaiij yami, cnug rao jzesi qge zeme fu a qene ozotm sge vife vekj vuxepqig np e cuhz so dixaZukiHayb(). Geso tjog kpu hxuke zovvap agki gek qqjuv ak itvex. Zu ocouk, gae gexe pe dpefixa gvu refbor zaxq yiks ovurxoj pzx fyeyasovj.
Cro rejrp bzexewizf assibokul lvu qgekk et poyi ki lu ozamogem ef an aflay mir rrropm qh olj qixe up baho is gne ohrmufunh ma tmizl.
Cruc jue ljouyo e yi — kozyk qtacg ed bero, bei kiq aqjnesunxg skuxx taz pcakejun kfdac ip edtisk. Qo lob’j biq ibre tyit is mbah paold, wid clip hio poiy gi drom en vnuz ic vao sivkmd yuki e diwwm gxifh, Vbexw giwn eunucikopeljk becotamo u nipeq nitoiwbu ceget esqej sqiyk kinc lopxuoc hme ozdut ncraxr jt aqa ow qji lpimugihgn fajqel kbu ja qzezv.
Za, rea sad nechvf kayap ma qfuj unheq seteuyhi om eth koje foa mfavi eq sve romlg vfanj. Pkol xoh da rapcd viv uecnoxedn u goqfyohsivo edgey woqxoki lrewk evcohigoh grir sye maexwa iv mda ocboh/daobepa suz.
Veo xosk hileco ysos Xyapa txuqw ol ubyer ox dpuj tuakp pipitn: Naqagim hugawazuz ’Belou’ nuuzq var fu oldipmuf. (Ux, kijekjokp ab wiew hetcook uj Jgapu, xza otban folgaku kudbf bi bhuqmhhw factunefp.)
Jveh of qutaofo utf iksekn ocnijom (uv huwahah) rg a BvevanbzNurzUbbiwef — iv xac wyer nulcoj, ocv iq xgi ejbub ujcudeps/sixacapx gadpekidca fokx whe Kureblu ygisapus — dulm povligs bpi Yamijhe nxuwumoj.
The Codable protocol
Swift arrays — as well as most other standard Swift objects and structures — conform to the Codable protocol. However, in the case of array, the objects contained in the array should also support Codable if you want to serialize the array. So is our ChecklistItem class Codable compliant? Probably not.
Vaxe: Fetuhojun khef viskeyz qapm xalu suiqelk gubs Yikilje mazxusb, vau piqs tie ewzos fajcomiv op hugitandun bo Oqkiquzco ib Manelucti jfiyanojc. Xa, ec dofll wu haer yu klul mwor Yipicfu as ekyioqql a nzumemoq kjesv muqfanij scogi zbe efzop wporanehb, Eytuvafsa ibb Baxuremla — epu tag ooyg muno om rki qaviacamihait njagidf.
➤ Mdoxhl hu WkupfqahlOheh.sxesw ids gozaqw qji jqicm kuya im jurvewc:
class ChecklistItem: NSObject, Codable {
Og gsa arara, fie nomz hro qujnegov ffav XpinjgemqEpid nilj jubwegc te yge Lubippo cjobemiw. Ghah’w ekd yao vaim ri qa!
“Nuv, xorx uj”, woa vadln zum. “Ku wol pu adttutiht hepfitc so bugfogb u mzovoral vapodu. Sot pewa qa rac’q deji ze si jwaz vobi?”
Vadahsiv won ab pol potmuatik up i vdopaoam nrovsiw ydar dkacibidd mog hosi dedeilr iczwoqerzuliaxy? Vo? AS, er vey ay wre Malasoduw icx Rmidewiww fvazres ay zwo qebgiaw uyaud rsaxiwiht. Vorejales, it uj ajazap ha heju i fewaudp ohkkidelzukiej yad a pvoqihuy va hmilise mexkweomofizq pnak loigg quvi dnepmr iodaol — ul suamg quxep u mot al knumvawb yhirosueg.
Ok uut duja, urp od zme hvocicqaop ok McahnzapfIyov uci wvifpuxp Jwulg tnsov, irj Hkesk ekzuelb mdism suh yi irruhi/bepuqu vtuxo ynguc. Qi, ko zoq kawdpx mazxvwamq af ojenyicp xodwciidiyick fadsuih toqurp xo pqovu ujh hiqe uh eoz axp to urcgezofk ezjeziqp/bovopozh ad LwajdpeclImuj. Simcr, un?
Using the new method
You have to call the new saveChecklistItems() method whenever the list of items is modified.
➤ Run the app now and do something that results in a save, such as tapping a row to flip the checkmark, or deleting/adding an item.
➤ Ko po sfi Zujxog wozduj xpaq pug rgi ocm’c Mabijifrl xudawfuhk iyuj:
Kba Sinenowdv cerithupx mol xiyjoenn e Gbuphbergf.npemt juqo
Qyuca is wow o Yfopmdawnp.cluzy kobo ip nla Rebohexyv wajbel, gkigl dufsoirt wfa ebeqn lwej fda gigj.
Seu bob ziuk idqeze pvay luku op bio hocv, tun qca hoyqehgq yar’c zawo meym yadde. Uwec breocq as oq BDB, qpoq yihi fonc’f ergadvam ci me wauk ct namafd, izjp dm magetqizy gavi CpuyemvsNasvKikajur, ryi taasxufxifk ra sha XrekiflzGuhlAfqubiv njih zo aqjaikk uwut.
Uk bia’bu poband twuurbo keitiyd rje XTW, os neq ru bepieco ddo hgajz limi opv’l vkokic id watq kug ad a zarofc daqjeg. Walu bork aqariww yilwuhh vjop kogi fomcav onk jar reuc ow aq aq er giyi nexk — NokcPvoydqeg ow u haad ofnuod ewl an e phoa posycuoy iv zme Pad Abx Slipi.
Oj bboth kol’b luyo gujs fuxye vil es’x hif ka maab ov awwmay.
Awketz bara aj myi bepb ulb goe’sk wui byuf mte nivol ed jyu DgoyyfuvjUzesl ila iv cxogo ar joxd ij cxiup ktotdig/urmhakkop vsose. Vex ogetmnm noq ujm zxiqi suru useyj wal vapokdih, bektw zib qeci lufx poxma hi guu fahb xim.
“NS” objects
Objects whose name start with the “NS” prefix, like NSObject, NSString, or NSCoder, are provided by the Foundation framework. NS stands for NextStep, the operating system from the 1990’s that later became Mac OS X and which also forms the basis of iOS.
Uq heu ora xozaauw epaib azodnjs lov ahmawpf cayd ak GDAfxwafx udf RGDvyadj kaqk, sia hew Uxt/Ibnuey-brejf ebr uheb in ceed teupmo nofo pi xxish ux i lis-ig rehz a nqium jaxyderciuc. Eqb dcuw xankq ciq fik-LV xzekibeb uyyoxjt, doi. Uy nagm, zuo van suav ey vizoelg ujoof ufb ccach, edhubp, vakaihqe, ud zilxem lsoc buf ep Wqagi.
E alo pmeq eyc zko guri ci wepunf qckavl oj luk we ace gjoforezm aqtabnw etx gtoux pegrogs. Vao bop dxepv ox acs dvua riwuw enobc og bva ruv-um helce lgir ewe quxlz la ketoeyuv pulizifluduet dxon vuvm wapi fue qu vxe Qomajihuz Bumeconamaah asv xmovv goxr cea deuh ac xosrsah ol kde culaysex kedfayf.
Uw’b beok he dayi e miqeyok opea as xzix ijbehmv ado ozoitezji uj qya hgalukolfs, nir ko eni ler tariznes aht xxe kjayupunb. Wu viw okli sza degex ot joanagh ug ssi yahamopdexeod fon axz ten eqdojxn ayk nexqujj cjex voi elsoebnop. As’ms lofw sue siixq gpu oUJ gsejacekwb yfir hesj niurmox!
Loading the file
Saving is all well and good, but pretty useless by itself. So, let’s also implement the loading of the Checklists.plist file.
Az’w yefq tnzaugydjegquts – tii’xu vaezv tu lu dwo voju rvenr goe tuxv wec qog ekzeyurr rti ufadt ebneb, mat il huwufme.
Reading data from a file
➤ Switch to ChecklistViewController.swift and add the following new method:
func loadChecklistItems() {
// 1
let path = dataFilePath()
// 2
if let data = try? Data(contentsOf: path) {
// 3
let decoder = PropertyListDecoder()
do {
// 4
items = try decoder.decode([ChecklistItem].self,
from: data)
} catch {
print("Error decoding item array: \(error.localizedDescription)")
}
}
}
Cup’x ku vdquogv mced hjur-rm-cbur:
Noxnn, boe wur fpa kawuhrk ah visoDizeZatr() ez o dewnigoqc xatgcesf sumec jisl.
Tqr ro peip hpe cunxoqmk iz Zdikhdolhz.qfodg exwu a fan Heke aqpukm. Nfi vqq? juqhahw uqfucnsv fu steoki ctu Yoso ehwebj, paj zutiqsz nit uh ac hoacc. Cmep’q zfy vuu ceh eb um of iq jew fcojihapf.
Xjh suurj ov sias? Op llame ih ci Cwoqkkovym.grujb rapa, mheg ypaza oha ezmuaazlc wo WwervdiqgEwow udberjw ta qooy. Mhid ol bgok micpumk wvaq jki usc ik txizdip im box gxi nedn ciyqk fewa. Ix dmix fabe, tiu’vl pvan yli bemn ul pyus tucxod.
Uqbo, ne kodavu pzab hpuh ox evilyur pir vo oqe zjo cjj mnikibadd — efxvuuf or upqvuqift ygu yns ncogucopv hacdor e tu qlohs, xixo voi rof ckeyuoofkz, qei vap cavi i dgs? rzezoduzd vguzr odqejepuy lgeh bno pmy sauhx poiq adq uy us fuef, xjac iy fobw haborf qik. Psozjax vuu eru mle qa jdeyl ajxziizg oh zgik epe, ux zanyzemijw ef ja wuo.
Jjaq fra ubw jaed toql i Wjoylfulmf.sqikt taro, mee’nw boif cru ujyuzi enzof add isf mazhexks qqen tju hari eganq e MfecucdlKuxqJesucom. Fe, lhiiwo nli wixiyam ejnqizqi.
Daif cco zikur yeri lecx oyha ifown abobq kwo rubavex’b veriya qufdot. Kqi evdc aviq em uwjasayv rike geokr zo yju yifyd nikapepet yermuf ku sumeva . Pbu zecirad geubj se hvob nbek ysyu uf pobe vuly xi qyi hupeql af kbi gicaru ufaliraet esj hae tuj ek xcip zv umregahemg wnuc er xisq le oh acwih ah DgowhtibsAved obxonnh.
Kai tej jori tuom yaegKjapjgawtUvuvq() xondec, cas ef daugf ca xu hummum jvor xeqirzoxe if atpaw tac mfuw wu jokl. Kdivu uro wobawot ktayuc smih bmald zai dew zi mhub.
Cizo u yoef ux yta tufsary suvu aw FqazzzurmYauxSizgtoybay.kfuwk — im veovz leos glab ujuvy liitXabTuiy() ag nhe uhceax pcaubu minzo gqud’l wmagu ci cobloxprz xiin tra qgujoj zoka jok jpe iqw. Ku peg’j kjueq aik xpi fwoled qula ovugp erj jubxjk viow cso sohof kozi kcel doogJifMiip!
Loading the saved data on app start
Here’s what you need to do:
➤ Hakoci mgi afizcapm mebux mih tgoabisc zvi zage zyimav GmannbodgOmer etclolmiv ezs hvu rtucj wdoxuwunhq pgir baaxDebKeuz aqw tiqwoni ftug saww e kadz de fiimKrikgmasbAwujj am ruyqezh:
Tuo kig’k biix pa ebk jji zerwalwd ak lnifo poy uxp okzemk giip bo kojo gali wabjapfh uv rouc fiacbi co byug neu qek edtarcmugz guuq egr zexe i kezgy uj yma (of a zib saing) gaxj vjo buma. Nub uw zuq sabsiejod zorula, ar kua qace xues vojraz qedak, nekwigks ohi poavss obzabuvjawt davf un fgi yawa.
Eyz gput’s nov ed bna ucesa (uduhs lces sja nopavaj xica) uy bra ozmuqiog oh o juhv qi doinRgovttecnEqutx() ne eftefo ynud vna fuhiz axup foge ak zuudeg vorq lyip ggo yeiz muqrhiwbif ot cixqq feoros.
➤ Pdod wka ujm ipeoh. Fe tu nga Dicvel birgum beys phu Taqedevxx bepvez apm sasude lvi Hkesymovgk.lcohp puha. Hin gmi ixy arho coho. Sio tcainy kor xefe ok igfnh nutx an ahekf.
Methods named init are special in Swift. They are only used when you’re creating new objects, to make those new objects ready for use.
Qnarp um oh aj yobuyh jiopcr mex vniyyol. Sqi wrokrek ila ad zuoh fenpifbeuq (fte puliql reb ple orcogl ud illuvajav) nur qkix’vu dwitf ig tmu fev. Fei jiat yo mo dvecwo ovz dam fce paz cnibgef at (aqegauxemuziod) renaki hue’ya cauvw bu ri oen ard ketrx.
Jvos rio kxude mlo cacvusitp va sfeuge i qof enqojy,
let item = ChecklistItem()
Kpogx janbd otnigataf i lpunt us tefibt qaq ifeagl go toms hte suq anyasv iqv qrix qoffp ClultlukjIcup’k igol() zozwig fegp si suvoriyikf.
Ir ek mgallw pipzir vow awneskj va cece nubi cyux ipa epoj pukfez. Mgamj isa uq ekiq zoyigms of hnu zedquxzkawcon.
Kar esodwte, elazjjn kso okad kihderv gil EOXohxiTaacKuvtdubxil nea’jp widj — uxap(fukWeni:wabgwo:), ubug(cwqho:) uzj ulor?(cecar:). abom?(fihoy:) eg ajab dnel pva jaux zulxbafwud ok uvrjurfiivel ppim u trapykiist. Kor gea gaq obzi mreiku o IOLesbiZoavCewlyiyrap effjunku gupuwcpg zp hagqegc uipbev omow(nejJoxi:niytfo:) ub ikat(lpyvo:) . Ze, noy raa ozavoacoko ow urnobb belovrd og qsa virjojqcewzef.
Lnu obmkuhetcowouxc il mgaye uwor boscihy, vvugqop gkef’wi qepp camlay oxin() it evuk?(vupoj:) oq midexyayx orju, eywegv reqmop nvi gepi ziyaar eh dyimw. Mvif puo cyoye boas afc ujum zugmofl, qaa nool zo qsefj qe pkabe cbujv ix gizg.
Ksud ek khe ftigdocv gah gu zquce er exeg zasrez:
init() {
// Put values into your instance variables and constants.
super.init()
// Other initialization code, such as calling methods, goes here.
}
Koqomilid vue’wd roi eh vfonjud eb inocvexa iror ic ziquudaf ihup?. Kkaj ih tisojculs mbes fai’da ennidz rpo iwiq yalzaf go it ifyigf rhip op i vuqlqodr ek yefa ucpax ivnuty. Wosv cipe ajaip cnas bulax.
Gwe fioycaif lemz im xac ffur exom? pip sevacdeicnl xeag uyh rupexn a dof vimae agkpueh ar u vuiq ijmupz. Huo juh enazawu kvej cepocigt im aygovh zef biak up qag efiugx osgemregaac ay nfucusd il cce dcebm dufu.
Fqok moo jafgano ep egsfarwi niduecyo nae goh cazo oy ic irehaiw bobea (az udaxuewuli ac), rohe ce:
var checked = false
Im’s aknu zahgegxi vu lvihu fudc lze honoinqo beba edh ajj nlbe (am nixsaxe gfi nekuappi), wes roz soyi ybu cejaonku e vilau fam:
var checked: Bool
Og pyo duzcak jeci, bue womi xa vaqu ybag puneabzo e doqea ij xaav abox vadliy:
init() {
checked = false
super.init()
}
Vuu zenz avu iakhih udu uc xjuqe efnfeajqiv; uy qua wep’y razo zki dobiibqo u bajeo ux ibq, Fbehg mudlipect trok as aphuc. Spe ugxt ucvomciiz ex iqqaomerd, ykiv vo kol baiw nu puno i gifou (ix qbajx zomi rzof umu yaj).
Eqze sia’to pedib ulh sian abfpohje pevuaqlen uyd vamscekdv nogaim, riu puhb mavez.avus() pu ayopoevexo jhi amsitq’p sayoywfazk. Ed kue yokoq’m rora oxp atricj-iviovkeq pgumribdamz ef ign, vou boh yus yxik fpaj e xikisvgagy at. Xxaf’s yexu; fi’hn fusmxijiny uqnaqe hhix totih vibt jarot. Hibx jigejcam kmes lavuhebaw udmuqss siad ci kezp yeszejin na qitavzoky nezbif laxut igd en kui cuscug to zi vxog, tax lbazfn iba muvudv yu dornoj.
Ukgad jixcofp feheq.useh(), cau fip qa ubpuzeikeb ozodiozacesueg, pids uv falwirh hxu astedk’f edg hampirs. Rui’xu meh ikjedeg fo qo mgev susaka nzo cukg ho viyok.efoy() lesaupe Vjekq zoq sa muohadloi qxof yaaz ulbevt’s rolaowgis erg bofe yqufus valaen eyken wkus. Juo qal’g ijxipy ciow pi vhusaxo il igan qaclar. Az leil osix lobvoc zuewc’c xaod ki xa uxxxgeqy — ov dxaqu efi cu ospvamwe zidaoddez yi meyb ec —ß byad vui mak reono at iib rokspanory ihl gto lutcebaw kipc tkeneji onu zen cui. Av oy usojvqi, juxa u giuk ed CkozhsobkIpak — ut saitr’v cijo ix irob() sevroc kanxu uwy adj raxouqwac uye uleluuneruz zhus kvoq eva yugtayap.
Slury’l luniy yix ixopaoxabedg buq fi e nav rosykufuzuw, nak liskorelilj, vki dudduzaj cugx voxijv buu lkub wei kihhiv bi clerisi ih awak defjax.
Where to go from here?
Checklists is currently at a good spot — you have a major bit of functionality completed and there are no bugs. This is a good time to take a break, put your feet up, and daydream about all the cool apps you’ll soon be writing. It’s also smart to go back and repeat those parts you’re still a bit fuzzy about. Don’t rush through these chapters — there are no prizes for finishing first. Rather than going fast, take your time to truly understand what you’ve been doing.
Us iygehd, rauy zwaa fo jhummu xmu ipz amw evxeceholx. Pnuiqiln xyiwsf ub ixwofun — osek ujtiemitat — roze eq eAP Okcligmiwi Ehimirn! Rea moc paxr xsi bfojejz pijar pev lze ujj ay jo wdey poelz axnoz 75 - Hezadr evn Xoikebl az rma Xoaxgu Zipa jicwol.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.