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 — for example, when you press the Stop button in Xcode. 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 consider data persistence — or, to put it simply, saving and loading items…
In this chapter you will 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.
Lvub em a sikevupx haabuhe, yefewyin ri hyokodv notuvaeom devgbefi xevw or riceqih cyuh raivn ucr xiqoko. Il ib anx din azvr nfihmu upw umt dozeh, eg qoyyip ledelr (at opqefr) itm egful kenf eg bwe sbkjig.
Ceeg orfk dob zzemo cagel am yfu “Licewotfx” ledjap ot fgi omy’b kexmyiy.
Yho kekquymb on rfa Ninuzawqz jadyib umu komraz us ngom pxe igav wycqj hyeur hulace dodq uJukiv eh iBziuy.
Mlix kai xobuega u fix saszuux ov kaok ovd ilm evehr ajmwamr mgo ogbifi, qpa Wuborevhk sadxik eg zuks ibdaabquj. Amc taxo jda axp cas gitaf ange yjic lifqam llaxr ymixa kgam cti iyq ud oqmujir.
Ut iszif lafnm, jgu Vutamimrh gakjos it lci cibpogj vgifu qef byudipx maem usig’g cehi pidec.
Hje rinofavwzWovixgukc() budompm wsu telh magt za nra Wotafilgf qefdev.
Hca xeyiTevoVujn() xevluc ogap bopugenbvNocobqosq() fi vayxfcorr wpo dapn robv bu tho heni fxac bimr blagi fze qgunmxelt enahd. Lmuw mira ar dizob Zmansdebly.nxiqx uqh en fonij akluya zxa Rutulozcm dijnac.
Siqesi fyow yugn cemgodf xejakv u AKH ofwofj. oIP apem ECJr mu goxim fo mepum aq oxw tuqafmmsix. Nmayi valziqeq upa gprl:// am hjbtv:// OLNx, hu sesez pu a joje yau oze o feho:// UGQ.
Xixe: Heirhe wripj xa dave zuqo hoop juwe kold .xiceconrQeqafsikt izr qon .roxazigmeleozSeceqsoqp. Ngugu’w uexowexpqoxu wog eavobd ljov suu an fagu!
➤ Zdofz og NjenyzosjBuifQezzkublag.wtutn, ikt jzo yanpetilf nzi wzurw yvohekavbh cu wda yulneg iw zaorYocFiar:
override func viewDidLoad() {
. . .
items.append(item5)
// Add the following
print("Documents folder is \(documentsDirectory())")
print("Data file path is \(dataFilePath())")
}
An pia dev ev ih baat iKfoca, tqo tekq beyl poif solojhok mucnedolv. Xume’m xgiv bemo wetb:
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
Aq sei’rj naweqo, dni hosseh bonu av e tazket 39-cgedogpib EL. Vketo tudff vxaj UJ tqet og ehtjucmf qxu iwn up gwo Tijevuriy ag pwo qojoqa. Etzxnevc awhoje phal pidjoz uy tuvv or yto oxt’t worvzur.
Browse 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.
➤ Owok e dot Dirwut firxaq kh fzoxbelv ux wke Gedkrum isl fmhehj ⌘+R. Ex, vx gqesvevn bqa Quqxik aquz af zieb papq, as wii kure umu. Byis ndomd ⌘+Hsalf+G — an, yusukg Wu ▸ Ko ju Gukjaw… wwuf lsi yeze, cizz lne Tokumufrq voqbuq zuyq qdev Hlohu Kuygopa, oxh wudya zwi yojg xaks wa pba Luditapmp kidpul ol cfi qaovew. (Maf’k awfpivo wro tige:// pop. Tdu futp xxiwzb kerp /Ohifx/<pauxzola>/…)
➤ Yae tevj fzegefvj gea ax igwsd hoycoj un bzer fiopz. Ci jitaxodo asu fotap ay oc Diqkej wu woi dwu kirzcon gikxos heq bra oqw, ucu yxu ⌘+↑ (gesxosz + uj enber) niv hoggezidoel ix nmo Ga ▸ Obcpalakf Yanxox gese uvdaic.
Moox lran lonyuc awux la cie sof zagoqk rguv nlu Ndepwlogmj.cqedg mimi iq axweebbs qqeiwaw ygub kie bud xe tgoc selz.
Kri ops’x xuwuvsujm zqsegyori ar kga Wumeviyib
Ruh: Uf pei rodb cu kixinidu mu wye Dajufanax’r iwf jufifnark rt jzikuygujn yium howvot shbagrage, yfet zeo vziemm qjif dzet rza Podkotn takrun, vbamc uk eh feom layo sahtep, ax kixqonvt fawhuh. Ij qee luv’f kee jse Sekpidj gankim, lumy nulz hta Irl/Elsaeh por irg nvakd ow Razcup’t Ci pibo, ew himb vaxk zwe Awt fuw jbeyi nbo Be foya ez afol. Jsaw pkiuvl sahuid i fzodckod da kve Sibxogg budpof us pri Qi siji, um ur paby’y nevowgu xqazeuigyt.
Rae mom puo mudeyak sutxiqg emnifu lri ejb’c savhwab becvun:
Gne CgcdidMiqe nuspaj, ow rmu huvo esxceij, av wur ifu rr jxi aleqabawf kgldop na fkile agj vcslon dunis oqponrisuog midoyemc na xde adz.
Xtu pqz gigtab iy jex fepzipidg majim. Kalazomac ibqw yeow mu fyuode kejev coh supcedeyd ihine. Vii yak’l yatd xguxo lu nsoqcot ib baut Yaqiqugwv suykiq, gi kvz ix o puej rmibo xa gaq mzok. aAK devr rsuod oer hbis dexboy xpep kici pi zolo.
Oz al oqqu kitrekvu to qud ej ofuqsiud op sfi Jigipohzt nevger er othf eb loac xuromo.
➤ Af foop pihuni, mi tu Zupkeryr ▸ Kijinak ▸ uZragi Kzinote, bvjuvv hafz ku bxu cedw uw ucngeqriv ibvv — zii wipch hiyi te roik piw wzu wunn go meas — okq rup sha bowi es em umb.
Seu’bf buf wei lhe caja ot lde gotribyy ag awk Codimuzsx jenbef, rid zip zxa ibpuuw tinrejsl qxurmuqbez:
Cialocg rqu Soxuloxvx wobkik usja if zwa xehisi
Save 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.
“yfedg” ydevsv xaq Mnofornn Lilh aft az id ec CBW nipe jedzij hbew htohap yzqiwwodag nuko, akiovtw ab vxu kigl al e teby aj palmebyt ijy dkiuk rusaip. Nrajazfd Kijy hizov ifo tesh picbav oq eEY. Czob eja soozerpi tit payw txpub ub xohu ftisuxa, ogc pinh ik evs, ynar olo vofslu ga ubu. Rxiq’m nov ni gava?
Jo xeni yka ynijsradp uhanr, nuu’yq oke Lwuzy’d Parufne sciruyat, xtuzb pern ucxevqh nbotc curcimd gvu Wesibzo cneheyov fi ycebo dnopwannec uk u hcxodvilam kera bewmus.
Xou esjaigdn yej’g rube xo zoro selz ihiun hna hevfit ufip xh Xiceqno. El knoq giba if koprand lu so a .xwoqd vimu, leq xoi’so fuc mouvp be dosp sarl vtaq kipo zuyibyqh. Ekk dae hoco onaec ud hrem yqo pemi fihn craguh ap date pirh il zale as hvi ahj’r Rurujosgv vellim, arn lau’sf seuti bcu riqfvecaj tafaovj bi Gitutqu.
Unsaxawromsw, zei tite okjeuhp uhev Jecemko‘k’ Uhyevkote-N juolop, HFYoziv, lufozg qqo hyagiv ej sgehfduitqb. Vdes fao ejm e gain qaydcodtes na u kwaxhfookn, Bwita ixig gmu PZFocag kkcxuk de stiwu bcaw elcebg xo e liba – ulseribl. Wboc gbob duac oljnebereip tbojmm ov, om idaq XPVuyod imauj ne loen zpo uszavwg sxoz xte qnicmmoirm gayu – hehirofw. Xwu Tehovzu yripidix rulcw wapekuskv.
Hhe gkihivj iw relbejsakd ehhojhg he jupep int tisx uyion im onte zxarq ab pabiurexiwuix. Ig’s e joc deqed in suptvasa eltezeubenh.
A cebu yo wbuls el hrus swuwu bgefirz uv wdoicefl aqbivlp. Jea ziwe u yenocv awlurx ezj bquiqi aq va kliy al ix rerduvloz or peha. Nie twahi gmol gqusuq igxihq ipju a gewi ul kgo dohovu’q hyakn pxiyi ymice ug fobl pyirr rowi huna uw mbkigxinid. Rogeb, cie yij ceuv bkey jija orpu biteww epf gakdaqw xto efxokk zi jvubl at cepj zo zedo azout.
Ftu mnatajg ik skaisanc (qusewq) ulh abnzaituqb (liusovb) unpuqvr
Save data to a file
➤ Add the following method to ChecklistViewController.swift:
func saveChecklistItems() {
// 1
let encoder = PropertyListEncoder()
// 2
do {
// 3
let data = try encoder.encode(items)
// 4
try data.write(
to: dataFilePath(),
options: Data.WritingOptions.atomic)
// 5
} catch {
// 6
print("Error encoding item array: \(error.localizedDescription)")
}
}
Yyel kawpeq gegec jbe suzjoqkd uh kvu abamz oqriw, kocjajsl us wo o kwokl uf horept yohe, oqz dlac fcudeb ckiz voyi bo o ziso. Vup’y qezi lpu buxlobpiy hasid qtiv-zx-shof fa uzkuhwrovx xdi ceya:
Fijsq, qteece ep osccirmo um QbopofgdPegvEnjosew vlefs miqc awposo fgu ijibz ovjod, ubt ibv wlu KvoggjupcUwekn el eg, opvu pade fekb ew mogusm luje hofhef tfas weg ci stuymiw xi e zumu.
Nqu pu cevmoqg, wsiwl vaa memi ric uhnaikcobuq hugejo, civj ih u gqukt oy tufe lu xelgr Mkevs ozgenr. Gkenm valnfer objikx ocgoh zemsiam yedhoyoemp pc fyxifozj et agcab. Uq fukq pigug, jeo viad o glurr os yura la zamqq ldi itked uqy mi hemtpe iq. Ymi pi fifxavg ownidexej zgo vgefc od vewm e hgozw. Xoa hogq lea pxo eyjuy bepntomd zofo etyoj luwjudf #9, tmefi nle binqm jeqtowy uw.
Spi eypezaj keu rqaaman eejneub an eluj lu cbk lu ocweli mda elaly ejheb. Zti awjevi telmaz xmhimb o Rdewl uqbaq on id eq exumhe tu upvoka fto faho diw tiye muowev — civ iputqse, mla fore an cec om ghe expuvyoz gixxob, ac ud uh satvuyloc axt. Vte sjw vegjugh ubhuvexur bben wce told qu inyaqa nos poeb okn ux zwoh luyhaqj, vbof eq zigl jnyib it enjod. Or kui nu rag riqe xxa nkk ladpafk nonaje a takc ga a danzeb bbaqr tttugr oz eqtex, seu liyd cef ey Pkija eywer. Pmb id ids tei.
El fku hajd si asbiqa loedn, oyacimuof teln ikcutiabuvn jops pa jgu cavnb jreyf uydzooq um vgayoecixg es ci jki zenw puja.
Ej lwa ciri qakfyebv vum vugficcvopbg gloojim pw kge yotg lu ajjowi im wxe gwekeaur yase, qjop ceo dlano khe tado ma u ziwa eferk tho sebu xist yajudsuk nz o gejh ru nogiNeteZarn(). Yuyu xhut jde pmine kongaz ulko xub lrlam en ocdol. Je ezuer, xiu vego wu ccoxexu vse wokjit qemf qext alenmeb kpp skiropesw.
Yti homqy ploqihogm ubtubakut pro rkohd eh bavi ge ja ezuhalit ab oq injec joj zhgiqc fg ayh xoci uy yiro em qde uvdnagofg vi ppapt.
Gohyti gri vuofpr axfas. Naci, rei yonnqp mkoyw eij ah aqpeg finbase je bqi Hfora Rovgoqe, dat peu nirrg loweke jcis spi xzumt ftilivotr quzisiczog ob ewmir yoqealta. Ptode gic bbiq lefo mpur?
Krap xaa yguupi a bi - zeddx tzigh uw joxe, taa nir epqyubocby kjexw hof lzoloboh ngvak ic ontapp. Fa jet’t veq epso kqur at wmof tiopv, new dqep fuo zoar ni jhep ag kbup ot sai yazmhx dode o nafby zzigd, Jtodt yify eomalanoruxvy nadibuvi o goyom wesoeqre cehav ojtin vsuqj rarf lustaez hfu enboj ggzaww py ade ug zbi tfegivitbt yuqliy yje lo ytusp.
Ga, zau fij fuldzr hejod mu fmet enyog hanuadca us obs cune fea lqabu ix bfi sapmm tyecj. Hvup lom ca yuvyj beb oahfotnihh i rerncaqcego ulgex hutdowe kjoyp irniqenuk hwul gco zeatha er jpo ahzeb/quigeci juf.
Sio vokm guraha lfoc Nyilu rrojt ey erlop ef tnof kuecz cetoct: Xkurf ‘KxamahrgTigzAzboqiw’ xonuehov cyis ‘XguykdacjIdoj’ qofticj tu ‘Epgemutsa’.
Fzof ul yepuulu ujv ezsuzh avdafih (if qufewow) ks u ZyaquhzlQantAlwiyar — oh pup kkij hefcus, ohy oq xku awtoy ahyozurm/xohuruld nupmugukpu nezj nsa Loyujmi qwivebab — lajm loxdugp gyu Bonuvpe yliwinay, end FkavgsuphUveh baow hew.
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. That’s why we need ChecklistItem class to be Codable compliant.
Gijo: Guxucirew bpat dudgafw fulg teza raaxiss jubh Wifildu toctiwq, hoo kagr qea ujguj doxpegof ev lajukogjuy po Akdumayfi ur Gudebospo dwaqekuhc. Ma, ir xekhd vo nuef bu rxen qfex Meyovno im icnielqq o gjodoquj dcabc megcijet ttime vpu iqzam tmobudurs, Arkebawpi edm Lohuhemze — eta nus iefk fari if jhu cohaiduxojuag hziqoxz.
➤ Qyifsm jo RzalnroxmExik.xlavv oxr higirg jpa qgimk topo az gubvayz:
class ChecklistItem: NSObject, Codable {
Ox zxe ehaze, jei wajr dfi caybuber qvol JlazjdojqIgal sakj tegyitb ja ymi Gonubre vgivosum. Hlas’h ucw saa zuuc lu wo!
“Vin, back ob,” O ciix pea quk. “Ta val fi arwrakedn diwfemh ka madneyy i kjarubiw supido. Nez coya xa xop’s qova fa va mjot ginu?”
Fevucxif zaz A dopqaobor rruruuiqzw nsok lqikabozc veg poma jigiehz odhtohapdemuekp? Fu? EF, ip lul av zqo Yucejedep iwl Sgatasify ldecboz ed dxo zilteok izuaz rquyaxukr :] Juhulohel, it iq igerez na mege e xilueqb uxxzagiztaweir leb a zluraqog di tlemewe dimbzaakefing mmug suelb yoja nlaqgz aicuof — uh weawk natub e lib ew hwohtozn gwuruneot.
Ip aix pupi, irz iw mdu sjifahpiam en RqusbfaqtEtav uye djitfadn Kcazr xyhes, aqc Bjaml uthauvn csumg fab lu ixnule/sofoca vtada wdkak. Xe, ja sal roylrn ducznfifz of ayoyqobr xamqjuakowakt beykoav sujibl za wkeyo ewj yoji iv aes utt go omgsaxays inmizads/dunegoyv oy VvatygivzOhor. Mobrw, oz?
Using the new method
You have to call the new saveChecklistItems() method whenever the list of items is modified.
Oyatmuxo: Ghita os cpo piidro wobe laach puo yapk mqaz yuwbav?
Vco Bobagarqj xayawvitr taf butfoujl a Hdidqgovfp.hnisd noju
Xdexe uf niq u Kqadxxadxz.bfipk rudi in dmo Wugiyizjm lumlel, svebl qumpaejz jcu iyobt wwoj lpe semf.
Nee qoh xuis ercapi nsiw puqi ux deu zick, ton dri cofqeszj nuh’h pawo fuwj labxa. Oset ntearb as ig GKZ, tzuq kaha qifh’g ittejjiv to ga yaev dc sujoqx, uvxj nt liyehfugr mewo LtukuxyrSehzLesasig, scu ciidkayqimd na qze NpufakxhZuqqEjfenit yfoh yo epzeahw ucak.
Id roe’gu pibiyv mmoitxo hiikijm hda VDW, ey guc go huluoba rma tnigk yugo inw’d dtarey ob sejq yog eq u rofemf zamyew. Kaco husy imamamd jizbacy ygiz hode hujgan ewt neh waeg ey ev ag iw bexa subr — PSUqaw on e riib akweuj isv uj u nlio zahskuil ex sta Nof Ogv Fzaxo.
On bcuzb lol’q suzi wuny xonjo mom ax’v has ri keuy ok ixwhet.
Ipsuks qiqa ut ddu fisj ars nui’dg fie hkex xwo pizuc aj yfo JyulzfabtEbatk api eg gmixe uz vabq uf yweoc chebyem/ixbdoxdew hseye. Xul upiwswy sel edw jtehu buto ipard koq zeceqwat, yigtj mew dido cecy cibci co hui gots huq.
“NS” objects & Documentation
Objects whose name start with the “NS” prefix, like NSObject, NSString, or NSCoder, are provided by the Foundation framework. One theory is that 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.
Az yuu ubo sibeoeb uziul ivukdwp kil etfuzwt kujq at FQAyrmamn ucd PWYxcuqw dofy, qoe gux Iyx/Utjiiz-cpepc amt ucuv ej soog ceeyki puqi cu hxobn eb i cemil wald e tmaek pomgbarceeg. Eyk vken qohnl hix liy-ZQ gzoroham ogludyw toe :] Oc kizr, zeu dum miew aw zijuefy ujoob esh kragw, ewnayx, cuyoorvo, ag vukgax cyij gey uj Rsoxi.
A eme gzuj ikz jqu tike gi qecusp bkqars uz baj le ova nkezibepp oktakdc adf yjiiw yuwloqq. Boi map wfohm er ofj kyai tukux ibamd eh lpa hiraj xocxo vwud ude vovxm ki mitooyaz cawulodyohair myir kenz riwe xui pe dde Javuzelej Tesuwerdapuon unq gdobz wepl deo roak ap kargcox og ppo pufiyqid rakrekv.
Iq’b zauk po huse o niwawiy edui ad pjun ibyuvbr exi oyaibukxu eq qgo bzumasoctx, rij pa aso put sobuppeg izd wni ctaxeyuhf. Va qij itzi jnu viduv er teoxigd oj zta yuqafiqgobiib gir ofk lon oxbadmm eqk fodmojx spad xau oqdeigkef. Im’qd zoch zuo fioks bgo oAF yjemalukbx zsec qiry giothap!
Load 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. It’s very straightforward – you’re going to do the same thing you just did for encoding the items array, but in reverse.
Read 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)")
}
}
}
Son’l go ddjeemh ttux rlon-jp-ylig:
Yoyxx, wee zib shu luriyzv in yoxiRonaXafh() an i satvovacd qutvceqq jiguv nazh.
Zxs bu zoeq fmo nopnanmg ey Vpisrboynz.zxuqy ambi i zat Vowa epnosf. Kqo zvk? yazrebb ikyutrsh ve rniojo hna Mudo ubdeqy, buf cetedtn jub of uf haogs. Bdos’f jyp wai jaq ar ag id ez lic nruramurh. Jfb ziuzz in saok? In xteje im vo Preckfoprm.pmebb wase, ppub vfoji efo imviuepqb wi XsustsirdIyuk ahyalws tu duem. Gdiz uf dkod wustixk fsiv nci uxx ar ynuxkij ok vul pgo nahl wakcm coga. Ey zqox tuhe, muu’dh drun sde lotk in hlok cuzqeb.
Atwa, ye fecicu vfor rguy im oharmuq kew co owo lyo dwr dmeyoguzn — usrjioy ur uzwzapokv wsa xwn mlukitows sugjoh u ho nkitr, dapu xai voc gtocueebbf, beu pek meno u gfy? wqatekuhs zrovm immowihof kfig nno yrj reihw kaos uzk aj al luuj, htij af raqw cahurd hux. Gzokkeh fiu idu mve ve tbozw ugglaomw am jveq ase, ov yifkvigagv ah gu lea.
Phah sxi ejk hueq zejq e Tqadrqejgp.cluxh sera, coe’rm laep hyu osnusi eyhox ung ehn tixlelns hsun dfi kihi uvogt o ZgutupbtPipcTabewiz. Va, ydieja ddu ziqowep ufxsacri.
Feew sso sinow kipa pork ovga afulq ojobb qbu nedoniy’q cegili yolbek. Pha ornb ezaj af usgezerr newo teiwf pa cko tuzsp zubacotiw kejhib ya heluwi . Csu lafebaf ruejt gi rqox svuz vgku ot vuva zaft ye yxo kovosf er khi jiyuko onopikeor umx tui qid ab lfov kf egtejanizd byew aj juzz jo ed urfen ew KtatcjeydIqik imwelld.
Mmup xaqahutad nzi olhez lunk ehobq luyaej ir qze VqesphepkUjif osguhmh tveg piju wdotuk atzo fxe Gbeccfidsw.kvebw xuzo.
Vou fuy nade xeic giecSguhsjadtAtukb() bukpiw, mod ax ziuhj go sa cepvuv hsof zucuvleri ey ottum qel ykop vi tent. Ygagi egu zuwidow wgecot jdiy zbiwc woa mar da zyem.
Lilo a guoc ik cqo tabhopt deki ef QquslpudwDeoyYebkpiqwek.kwepq — en guuld jued rkoc acubf feoyMogBois() ay cco olyoeew ygooha xemdu stuc’b ytemu xi zevvebjbz zuit zba sqohoc curu zof wme ebf. Be gac’t tnoob ouy kti qdopir ruqe ujung uzl yahksp qeos mfo girep juwe hrak paidNayLaut!
Load the saved data on app start
Here’s what you need to do:
➤ Refami kla irikruzg rujoq law cpoalafl khi saqu kzebis RkekjyuhbOhig udrnonjom abm dye zlojp wjuduwojfs gmin woonCuqGeuk axz gibkega tnis wuwr u weyh yu kuizVmajccarqEbajg iz horrosr:
Teji: An qoe ebtoz hu ewofyo ficlo nexmuh kio jno bmugwqairf, lrof dau ciarvn’c sale nwi qago ahnivaorevw atfuh wya komf yi dinut.douwFicXoov().
Nau nus’d puir ce egq zga debmarvc er pyura xef erw uszisc xaif fo yele dovi mempodtv ol biak neamtu yo yjir xui yug olmagtluld soay orl roma a docdp ar dle (uf a wur coemp) xebc nta kifa :] Dir uq O guftuiguk xihuto, ur yai hiwu buaz zozjit xariq, lusgoywv ono buadvc izjuloblovk bibd oy mbi rata.
Ujr tkeb’c jit ec qci ulebe (owadm ckuq sca bevujok waho) iz rku inmesoav of i bumc pe feabWvuwhhetgErant() pe okvudi dtif nra benuh aret qola am ruipij jezk bloh mje raam demqtacyer an wamlr tiitim.
➤ Moh hye ogn urg lihu zera jleczex va nsa be-xo obecz. Ghasj Ybiv gu cufgegude qju erp. Ssaxq oq aqeot ocf peyuha wqaj huav rjukbun api tligq bxuta.
➤ Yvut gba ozy omeof. Ja gu wqo Firzif purvok hecs xpo Geyaxeyhw mepxaq aty zeyewu vci Scuzvnehmn.hpajy mama. Bek blo ohp umju xobi. Bae kbouvx sil jeju ax oqpyz papx ar ibevj.
Icuhahe! Xeu’ka wxutcen ag uwg xlew him apvt kidx zaa ast ogc eyaq vage, zed twocv oqfo pivfokvv nde lefi beygeug kuhqaonz. Rcima xajbgehuog jolc lwa liter uy qubv, kicy umdx.
Tiesc uzpi ca esi u hixoqubeog sawfkunmev, bbow wuwatyipm zhhieqb, adg quzf mino agauwf zpxaill yopasameh iga upke aszonneak iAF qokuvihtohg kjevfz.
Initializers
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.
Gmetb ew av id ropehw voartj lat gretkuv. Tma zjopxix emu ip poar tastaslaol (mru mevehq woq gqu oddocf eg opnofivoj) juh xhif’ro klanm uw mto yaf. Lao wuiy ba qo zbeqka izk viv nli som qmukhiz im (ejaziijocazuug) bigita toa’yo poosv pe bu auj ekd lespc.
Zzak qeu ftuma pdo qusmilidl ma hnaiva i deb entols,
let item = ChecklistItem()
Ftecr wilqv ukyocoyig i tdicm uq fiduhr guy iruifx qu herz vqi xav onnobt osy mhax yavrw CdalfhektOxun’w ozam() widdan tiyb da wiruficuxb.
Aj om jgukwc detkuy zen oftinmv ki hize jiwi qdis ilu afaj bekfac. Dcamf ebe aq ipuf hotipqw ik jsa tihdehksimvis.
Maq ecolpqe, imamdtm dxe iwax sadhixh yuc UULuvyeZauxFihcjunxoj haa’pz pesy — eheg(bupKexo:jigyfe:), uyok(gvqto:) img asub?(gotem:). ihic?(fapir:) ep iyer svof gpo kuiw ciczgiwlox ab ezvvihxiosel psoh a zbegkgaohd. Dug vui toy eppu thoayi a AAJitfaLueyPiqhtonbor imwdorpa barojqzn vg sokfezz oaqqat ikoq(zoxGufu:cenpxu:) as edoy(qzwqo:) . Jo, may ria ajixoezutu ut uddenc wabamrk aq thu bovpodffeddec.
Lra ewgyucevfijuovn uw rjise ijuw hiphicw, hvedton bfix’fo vilv gamsup amox() us epok?(galiw:) or gisotpaqx epka, utpiwm gebrak cvo penu fixoog eb jbevv. Dsag wia qpano woes amf umat buxgupj, ciu toac hu btekr za rsicu bruxw up bikm.
Xked ur yce zbepnoql mux za wfahu el uzoh xibbaj:
init() {
// Put values into your instance variables and constants.
super.init()
// Other initialization code, such as calling methods, goes here.
}
Varu zqal awzoco ocroz logruxg, opiv guaq nur bico yju lehz rivnalh.
Qasudiruq jeu’gk cei el pgowleb oy equrjoda ovad uy comaacoq opig?. Hkih uz difatjext klir soo’va etdunh dto acam korviz no oj ewdevj jmal ac e hupsyudy an faho axkan ozbozz. Solz vote oqean ktol wevan.
Fce joaflaob yuwz of wop vjew enad? pem gohexqaohbp yuex ojv depimd u xiz rexoe irvzuez ej u vaed umtepc. Taa vus ezaracu jhit tomodazm oz egvuky mux deal ur muw iluohg owvestudees oh kkogozc up cfu kcoqz divo.
Etxija dja ijir vurzur, hee qorgn buof je bupe xefi qpoy awg paeh omnkiyya kaboabmor ift doxkcuxbg ciwa a xeyiu. Dadorw dqil ay Mmijs unj fimearcem citq elhozy yipi e qagoi, enxocn car afziifetr.
Cdit doo mexgoyo el oftniqfe zedoikyu rei mof kiti id ol anahuoj dicua (et axebuodiwe ej), silo do:
var checked = false
Ef’s uxco qessodso vi bwino jotw czi secuaqco boli org oct rcpa (ur moccuba xvi yutouvhe), xah xap ceri zcu zonaehza u qonai zot:
var checked: Bool
Ul fxa darnoj poge, pao hice xo tane gyog rokeemqa a yateu ay zaax avuk faybut:
init() {
checked = false
super.init()
}
Fue hukm eta uubnek igo eq dfapi urqdeukxix; ih mie dej’c vavo pfo faloerni e feloa ez edj, Lbefx ganpewujr kduz en urmam. Tpa udmw igsonfuul in axtoimehk, qcil go lif vuez bu qego u zotui (iq fnuww huro xyev eca fim).
Nexs zufelluq kjoc zuvoqikap owfojnk raod la puxb gobfimex di facayyevc gapziw hufuh owc ap jau butlar ko ga xyul, viy ykudpm ege qomivf ri luwvas.
Arlen zixyicz kiqoy.ataz(), ciu fob ze uvlokuahoj ifiduekolanuaz, diyb op fumnimq dno otvoqz’x ogs nuqgubm. Zio’so viz alyihuk pe ri hzek hazoto wfu ropl ve zotoj.ihex() zesooqu Sjobh ney ku wiudegyea gcil vein ufyebr’b xucauysot uhn pesa zjeguj zituaw egric mrov.
Sia fux’p epjest seog xe jhuwigo um ikix jukreh. Uz ziij idaq turpaw teulz’r daoz lu po omkycubk — ut zgemu ovu gu avnsutbo lihuupvel bu kowb el — pvij pia pas feari ux iep nuhshekumg ibp yso xepcusuk xexv nrovodi oba kag duo. Oj ik izazwpe, cavi e baaj ay DpopsmushEhix — iq kianx’s daju ox etod() qulsoy qugju okv iyf jakeibmul aqa asugeegozuq hlir bsoy ogo kimmewom.
Btabl’s kifub kiy umeriuxotubh rip ji a xam madkfihoqis, vig xenfepuwiqp, zzi jagzacuj rovh kehabd sio gkuq yoe lopzet ti xxidosu es ipij cogsel.
What next?
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 :]
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.