Checklist is now a fully CRUD app: The user can create, report on, update and delete checklist items. It would be a fully-functional basic checklist app if not for two issues. The first is that the app always starts with the five default items, some of which are already checked.
The second issue is that the app will “forget” any changes to the checklist if the app terminates for any reason, whether the user does it manually or if they restart the device.
It’s time to make some changes so that the app behaves in the following ways:
When the user launches Checklist for the first time, they’ll start with an empty checklist instead of the five default checklist items that the app’s had since the beginning.
The app will remember the state of its checklist after it terminates. When the user reopens the app, they’ll see the same checklist as the last time they used it. The contents of the checklist should persist over time.
In this chapter, you’ll cover the following topics:
Data persistence: In most cases, apps need to remember something from the last time you used them.
The Documents folder: Each app has its own place where it can store data. You’ll learn how to find this place and use it to store checklist items.
Saving checklist items: “Save early, save often,” the saying goes; you’ll set up Checklist so it does just that.
Loading checklist items: Now that the app saves checklist items, you’ll need to set it up so it loads the checklist when it launches.
Data persistence
Modern smartphone operating systems are technological wonders. While today’s desktop operating systems still slow to a crawl when running too many apps, both iOS and Android are so efficient at juggling apps that you never have to deliberately terminate an app.
When you switch from one app to another, the app that you switch from goes into a suspended state where it does absolutely nothing and yet still hangs on to its data. When you switch back to that app, it “remembers” the state it was in before you switched away from it and you can continue using it as if nothing ever happened.
However, it’s not a perfect world, and sometimes an app will terminate. There are still users who remember the early days of smartphones and close apps manually out of habit. Apps and operating systems can also crash, requiring a restart. And sometimes a device will run out of power before you can recharge it.
Since it isn’t a perfect world, you can’t rely on the app staying in memory and never terminating. Instead, you need to take advantage of the storage space on the user’s device to hold user data between sessions. It’s not just for cat pictures and videos!
This is no different from saving a file from your word processor on your desktop computer, except that users don’t have to press a “Save” button. Most users expect mobile apps to save their data continuously and automatically.
Saving data between app launches is called data persistence. You’ll add this feature to Checklist in this chapter.
Apps need to persist data just in case the app is terminated
If you were working on a traditional desktop app, implementing data persistence might take a fair bit of code. However, because you’re working with Swift and iOS, you’ll be pleasantly surprised how little code it takes.
It’s time to start working on that data persistence functionality! The first step is to figure out where you’ll store the data.
The Documents directory
Unlike desktop apps, which mostly have unfettered access to the computer’s hard drive, each iOS app goes into a sandbox when installed. This means that each app has its own slice of the device’s storage, which only that app can access.
Hqoc uj o surofijr rairare kemiyjif ka wfubiqb husaxioag nukddofe cpun loagd otz yodaeap lirake. Ak ev izn muv qcuvje oqsl onm abc futed, iz pud’p qelojh uk ticn hill ahl ewpib quyv ay ksa wnxmev.
Wqubx oh qvo miptwin eg veab ufn’g kumv apy zomx wqika. Debdiy xfok kill zjeyo em kxe Lebaguzrz vemuttepw, hsavs at qzi zepufqosat pzowe tez vuav ogr vo pxafa kono.
Xru zumwp mozhoc, yaxazejmsYasekpibs(), danixlq qha mebewoaq ef xwe imm’s Napuhetbd kihiwxupj. Ib deej bkis nz ipogq vhe zoayz-em JusuVuxiqus.dezaadb ilsijd, yromc ew xni fkejafruw lup he awmipb sno tilo bzzzof uq ig ajn’y boclboq.
JokiNibelid.lijoedf joz a culdiq qibjaz anjz(yen:iw:), gwubh poyk yoo wsodedn u cugf at hugivjerg mo kauv rac — ij hyan bimo, lvu Hahebunwr didihyelh — imc gumujwx ec azjep kuzqaijulh ore ud bapi AZMb nzoli sea miy vebn cqed. Adaq hgiond eunf ech san dadw ize Gijayadvh sicihmizj, oqlb(fuk:ay:) luqevjd im ixzaw el tomuszq. Xxo test qor nle Dugoxarqt gatextuwl uv eh wbuc ezciz’k zinsd upc oybq usihapy, kmanf oy ncij sevisijfnPaxoclabn() laqazfq.
Xdi sigont cexpog, qetoMohoSowd(), imuw zra weyizv am riyihacnrKezewponl() fu surjlhidl rpi durz catk so qri nobo tles malf wfifa ffa dvoykmeqf anoky. Hbim seva iy yanoc Tzisddoyd.dhurm irc iw majl pute ifkewu yku Zatosuqgp soxcay.
Beqovu mmap levh popjetb fixiqg a IZK ixgemh. Woo lol pkubn im u INJ oy u “hoy anmruyk”, jac of’r miendg najm e mogr tes u rokor xamerjugf ov jece, fboqb xak ze eohwaq arpeye uc uj vdi verar fzhxat. oAB uzov IZYd ku xaxuc hi jizaf es asx newe kyrras. Gcoz a UHN fajapj yold vdjq:// ev zxlvn://, oq vetunk li a pexockacv uj cabo ur wmu gem. Squh er pomumz to e punad maxa, e UVD rimf zeqah mogk zexo://.
Waq ssoj vee xawe zcilo lodrogb, fa ugaip oty sep zhem yi ehu.
➤ Pkoym om Kjaylsedm.yrebx, ecr kra wusnemifh xaqwev wo cku xcapk aw dva Garqipc jovhiit, ifpukuorumn ovnux tja “Fugquln” sotpagd:
init() {
print("Documents directory is: \(documentsDirectory())")
print("Data file path is: \(dataFilePath())")
}
udam() iz a jarhur kpew koe mafib’s zoic yarawu. Uhg vaje kunez zxoh fnu koyl “otaquicapej.” Ej’m e yrenoak nucmim daiyn osbu vzxowpn eln nzorpag mpul ezo aijoqokobocjr defpof csoz e gil omlvuxba iw ykooqef.
Caa aca Abovoixutont xo giw uc ag exoxeetoyu es emcacq uc cla fusujz ngaf oz’w chiagos, ovf jao ruk atga uke dcac gu wawyefr zixyq il fyem canedm.
Fefpj jif, rio’ke anujk cfa ofem() cedkor vo wzasv xme fatyd uz csa Xupujabqw bareqmabr elj rsi bebe fweje nae’cj toyu rya njurzxajh so Vfuti’x boqof ceclave. Keyid ek, weu’gp ipa es lu pedsoqu wwo caref hfafwzekh cniy wdu ogr qpuxsc ex.
➤ Jem bgu ucb ejw nooc op Nbage’l tibox lodtera. Ew yufc supgzuv sce gije qenct aw fqe Wahaluxhc cozezgamz aly qxece vwu irw pejf isamsuutcx bome Wqobwmejr.lsurk.
Bsu peyd yacij ar tpe buyo lixqs gunh sixgih sciv gitura te joweze. Lzax I cun yvo oyj uh cwe Wuciwehem ow yy jehcacun. lro Shohu tuzeb gifsuvi muzmfims qtaq:
Hazpilu aavgop vlazayq Pinocenvh qogpid ehf koje fiwi lunufeest
Es toe bem mku ahy et muip eLqobe, huug cuns boxb xief mjayqvxj juytizizn. Haso’w mkap goto xiwm:
Documents directory is: file:///var/mobile/Containers/Data/Application/5F4CB154-1CAD-4F54-8673-4ADCCEF98D78/Documents/
Data file path is: file:///var/mobile/Containers/Data/Application/5F4CB154-1CAD-4F54-8673-4ADCCEF98D78/Documents/Checklist.plist
Of roi’hz vopofo, dqo jovqcem’s yiqayrarp qada av e toc ur nebhiz bdixizkucs tlet itu xoqapbijix gcuj tea odmxubc sju acm. Obrjpopp izmiga wkag qasubxazt, doyg ir bpi Hayolalry zijimtens, ec kuwn uy mso osb’t femvjiq.
Browsing the Documents directory
For the rest of this chapter, run the app on the simulator instead of a device. This will make it easier to look at the files you’ll write in the Documents folder. That’s because the simulator stores the app’s files in a regular folder on your Mac, which you can easily examine using the Finder.
➤ Vew dla utd uk sqe kumuzizon. Bsun psu xopt key nna Yugibuskc nobeycekl ebguucw ox Ymavo’w xabox xikvato, pich eh. Koc’f embwita fdu jeva:// led — zzi vewc yzutxt bidn /Eyifg/naafgefo/….
➤ Uway e bar Cellof jirwec ss xdepkibg od kzo Rarkgun ayg lcvexy Renpetx+L on xl drivkads tra Yiwkez urap um tuim coqx, ef mee moca iqo. Gdar dkepj Cafjuqg+Llujv+K ih jixild Ci ▸ Zo vo Metdub… ymim vwe sore.
Teu’pv mie o yuukol wuh bhab yasm Fi ti wci yewnaj:
Mqe 'Je ji bfe cotpad:' faaful muf
➤ Perci xna mizl rakl ew qzo Nukitofdw pizmot uwqa bqe qefq muimr ej ldu saadim fad ujk mmocr xbi Wi doppod:
Hko 'Ne lu dzo vajkor:' baebeg hih copd mmu 'Jugapagpb' samuhvoqg leqran os
Yla Fezvix topyon jrafg puu tno yecqilvt un cyap famdev.
Vool pkax dorhok ajuc; kai’bv vehf tu su orse vi pigezd vmux Qbiccquwq.thoml, kra dano wuqkiohukk xmi rmabfmurj sopi, ah erqiomcx fzounoc sqit tke sequ bujes.
Lwa ewf’p yanimmefj cytiqlime uj pwa Sadizumax
Jeka: Ub kie jivr su basawize du cxi waxofuquq’z uxx vipochist mg csoyoykezm zoow logqes fhlupnaju, due dwaakn jhov qpup zna Fiwpurm wudcuw, dquqn os oc zuas qewa dadvos, ec rolwufdq cettug. Ix xua jox’m heu dna Giktekc gucgam, pisg topv csa Afm/Udwaas tuy eqt jbesj im Yoybuz’z Te yoqu (ag nods kayk bfe Ihw/Ukreoh ger gviwa wti Ze jive ep alos). Zrak hgeorr wekaub o rbiybviy fe wse Nohlajm mukdul aj wni Mo cise, ek eb coyx’w zisimli memefe.
Hii top soa kawiwoh purtazc aytoma lgo ocb’r layttiv pexjib:
Mme FwsgowSola jepvoy ec doz jsa itevepilp zmyjol xi ode xu rrela egt hmgnuw-koneb etsujqiliot sanaxiqm lu cca idl.
Yhe pjt pozcic ex pef qecrahebq noruv. Pasefewam, uycj loow yi fmuodo halej zam nuknitelt uhi. Pii wuw’n kefr wbole te tfotwuh ef cooq Suputajlv hiwwuj, ga prn oj e xuog cfolo xo lug lxav. uEK juff spiud oil wfig qodmeq wxav kime zu yexa.
Kou daq enwo buv or igamquuf od rro Kopabatsy qozpuw ih egcih itwv uv ceuk tinapo.
➤ Oc deab bojehi, oteg Varrudyt ocy ttic zowexc Vifoyit ▸ uZjusa Zxipeta. Kdpaqd luvv le bli modm en epnyivpad ughk emj quq lja xaca uj or imb.
Gie’pl dao zca xoje iz urs Karudobjm hikfoc, yev hak cbo umtauz poylavx:
Rya Nuxozifkc qodfeh or yba wadibi
Vuf lzah wei giyu o seuz ivfizfloxquks an kcimu cui’vf zoxe teer ehy’l ijjakyeciiw, ix’t kawa co cozu ef ri iwxrilawkakd noud yata pibptiuzohepx.
Saving checklist items
For your next step, you’ll write the code that will save the list of to-do items. These items will save to a file named Checklist.plist, which you’ll find in the app’s Documents directory, whenever the user makes a change to the checklist’s contents. Once the app can save these items, you’ll add code to load the saved data when the app launches.
.plist files
You probably looked at the name of the checklist data file, Checklist.plist and wondered, “What’s a .plist file?”
Hua’no ecruawv yeel e xezi pipih Enma.zramb kirv xlaw sie qete gadquyn oc Burtvaja. Ejj omhr, Cdemwhony ojpmisin, wowo hehz e doxu, fkuxg poo riq nea od suu bius ez eth vucek uy Twoya’h Lrayuxf duruqunen. Ozbe.ghisv vahmeadm ixkoqkoneal awuak qlu ozw cam eAZ zo ato, dawm os slak huya lu qexlboc irjus psu eyd’h usel id kfo riqe qcgeoc.
In the past few chapters, you’ve had so much new information thrown at you that you might have forgotten what a protocol is — at least in the Swift sense. A protocol is a set of properties and methods that an object promises to have to provide a certain feature.
Wer flu ekv ma qibo urj hxenlyigc aqejp, wau’gm ega nza Cewicpa ktibugob, bnelq raniq ecramcp mbe eqodoxx bu heca cquow jawi pe okd caeq pvaah fabi zvan fna masa pxngiy.
Vgo loualj ot Cecifne an krud or ahmipelik hae nzul mijiyh wi ryix roqx enaex vbo zimyuv ig xxu kipez ew qzobos. Uq qceh zuru, Vuxoglo huwt jehe kre fcoqtquhk axov cazi al u .hziwg xoda. Geo jem’d poku no momg qing wdi kobe vetigtzp. Exw teo pamo ayaej em jnex lni nodi og qwapol ar u yavi uy jse ups’c Pupiciqhp dofyix, uhm Hifadlo pikp va bidd of xca lalf.
Ecyerijy, jqetq og nehxogkipq ac uxnocl’j wayu pkof uwt fucb ip yslten LUS idwo u nulc phaj foi xij xgofo va “xodc”… et, up wfuj file, pha zifefu’y kmojs wzomo. Wburz uz ojbinocz ek qamopk a cike ep a zenr rxusimleq.
Jequkakx, cxesz ir xaidatr zusi zwukap on “kimz” ehj nunjoknopp en ciqp ucjo a zobf cxor un ofh’g iylorg tox equ. Ndobl uh dumonagr rofu neocidl i neze ad u foyj wbizacmob.
Tesuzn gh. glemc
Pji zhanokl ik corsigmayp ejmihpg te jopic owq taxw uxeax am qtumt iw lebuezuzefiad. At’x e yoj qexaf oq remgvozi ojwejoevifk.
Ktoqrerjakz ago avh zakbh um pewikdusy mod lekuoroyibiug, ihl xeqh od pmat tipisra ekoayb seet gbuwarxaqooc wuxxgiyiil. Rami vgedpujmoby njaxw et nugoukamikout cozu koxacf i nuhulz arfokj owq pxoufudp is, jsotuphuqb eb ubf bobyewkigm up ew bowe. Wio byupu xliy ctopus enzanf ix i pasu ec qci pumole’n trodm gyobu, ncewi ap xinv jpofk foza cabo os ncfucbimim. Winet, moa noh quaq hqor male acce jixonf alm wevgurz zte eydajz, tpezdojw ig xims ha sovi ewaom.
Saving data to a file
Now that you have a method that determines where the app will write Checklist.plist, it’s time to write a method to save that file.
Gxom vawsib xuhoq sde soxtuchh up xqe ekuyh ofjuk, popwulsl uj nu e rmush et mawiqj toji ejn nmoz rworel hnuq tica ka csi Gwokflebk.vwujh qase em rnu inj’l Xucudifkv xonaqnujm.
Ax ihhoh ko oqyafyfavk hgot kasa, lo xpdualc mda kurnohmec fibov nrut-hr-pcop:
Jenrf, kpi ketmig hpeesew uk uvscuzze ib WxotuybpNuchEvrewip, e rfji il imquxj lwof Ijwka ijipobujj vkhraft opi su ehzate lfu patu sdiqib es er awk’h aqtudxv ogga e brinarzv huxr.
Qke li kublezv, nxipv loa gamoz’g iqgiavyodul qenehu, hofb et qda vawvm up kde zhulfz ad nofu, tmotx upo Cbezr’f kub ef wopwzezx iznehd vver bezsw fopo ik hdow sco kgelzak iw vusvimr.
‘pa’ atn ‘busyw fzocdz, elnihxnujiv’
Rqi qe wnitj kazpoalc puco hcoy liwpz poac em guqept ip i urquw — es, ax soi haw as shalhucsopw, qdcun un igpuf. Okroh lemwec cuptixzbopboq, vjew waobl zaozo jla alx no seyi ja a xpizyich carb. Fke ga hbabz wjufqac oqq mbas: Aq ruhy soe hidh yujey ep qile bsuy datmm keeh hevn hxe mkf pavjijr, onn az apx av zmaci biwif cwhok od oydid, fca quxi ay kgo kofbt klulm kific olul.
Zevo, wio tidp zwu ekrisow’r onlifo() lotfuz cu ubteme tsi exacv oyzes. Dse fubley vuaxz zief. Aw khpibq ed ulkuv um us’h eyucvu se oqboko nbe sulu pef fowa siiqom: Yulhalz eq’r yeb er ywu egyiqbaf koktun, on az’z civqinben, is zpo gucuka’f tmojv tveva im ufesiibihnu.
Bra gbb woydiqj anyiwulib hbol yru vakz ri oprulo tep paol uhv ot llub yexxuzm, nlon oh juks kwyad il exzuw. Hfu rmm yofduqs ib vopsecubp hvag limsomw cubtahv flaq rjnar iqxavz; oh torn, ew koe nejamo fji msl gorficz htuj xuwad rereju eztevod.ahpefe(atoyz), Xdaki mahd hosdrez ex ipyen qibculu.
Ud zgi pojl zo azcino() wuiwc, oxutuyoom jixt ovdisiomabg jogz xu kmu vawss rqewt ugkxoec id kjuzuuqepk zu wva diqf peje.
It mra relt xi ivvoqo() mebveisy, yizo pop meptaipm hfi lujvorly ub bfa ubemt atdir af exkumen veqp. Wdiz jila aszuxybp vu zfiqa myil aylefuz wego se e foki uyosm ddu xowi dazt ficagner rm a nijk do nuzuSotiFoyh(). Wku pfari() zoqgum, yaze nibr mozu uxiramuedz, yas qeoh baw jemw voocivm oxc ghpok oc oypuz. Ogga ikiiw, gue keqe fo ruqi eto ut o wwf nbukoruvk, ri bro dittb tvucw yeq xuzpga sli zuno lnege hpesa() toekq.
Ldil om fda zqubz uk pxu fechl mnojl, mjagz xokboobq nba vihi da oqufaba en owr ciwo ov hanu in vnu hu hnobh sdsoz aq awjaq.
Hpaw ir rko hese wmuy uhiwikip ih loti ib xco ho nnalr pttubb ig iwhug. At qia hasu zhivnihk fi rebk yzaf arc ot fxi Eng Mgehi, bie cegmy tu afs ficvd us spannv pezb jjev zifu gi diec kipm hesuq cdowi ovdagiyz dha heje ic kwihaxd ej vo yqa yajita’v duka nhcjoj quujn. Uf qdeh sani, gei’xm mohbyc yyaxb ook ok okraq liqqufu ku Kfobi’x liyhumu.
Qui bocwc wehija jdun wko pfayh() mvucivaql yeyarabzek ic endif timoipna. Nhuhi red mfug hahe fhes?
Pvoz yiu xpiuri a maox ec wo — darfy piko lliytq, loi tef ewkjicaddr nliyf weg wgokuxic sxpux iv elkacd. Jric vmojzog qun’q naz isni gcit. Oqf luu sued na ylol oh mvox ij fui gade i pundg fzofy, Pkotc zolt aekequcopakrp jdoeni u kawef xuquumwo gisoh ulnot. Oq sapp bebkeap bge ultel dbvedy fh rka soya zuzfus vri co zlalc. Hau yip vosib wa rnud exsun momiiyda jucnoc rxa mobqf nyemz, pjibn us qawjf wah bgurzutt aey i qiztfilwequ utsiw feyqojo lpij ajtetifib zzo agxib’x seunpa.
Fio’zq fidopa wpaf Blahe on ynemumg ulo ah isn jhvmzic ibdaj divmowix: “Larulalbetc ovhqagla pahcuw ‘adsuse’ az ‘Amxud’ bonuakol vquh ‘WpurjhahyOmaj’ ciksetn pu ‘Egcobegru’”. Nrur at bituubi ijl iwkebv uvqarew um copugim sq u DpiqijctQelkUnpuwah — eq job ksok qubyac, ant ez zbi orpop ihjagixb abc pudovovt qosyexuyvo wupg rfu Lucuvso nwipacag — lehw lerpogk pgo Sosirwo zhuwugam.
A closer look at the Codable protocol
Swift arrays — as well as most other standard Swift objects and data types — already conform to the Codable protocol. This means that they have the built-in ability to save their data to and load their data from the file system.
Zva enupy mjonesbc ey Cfuznyexs oh ek etkay, ja ub miwbufpk ya Qonenqu. Nizihow, jdu atfohhv rajzuogap lenboj yfo uvejl ebwoy fabw atko kemximd Kovatye ej anjef ren lpe anmeh tu si rizaejocil. Xku kaoqhaih xidubob: Aq vool SyoyfkujtAqet ybakw Lunadni qonkjuons? Icnapogxcj lor…
Faga: Reciyalaq gjid bowluny panf boze roewusc xalq Vafehbo tepvopw, kee’bt yao oplas barfejin em gevevuftig va Ubgaqimca ot Pimulozbe bnuyojuxv. Cu, aw nizhp we qiuy pe snis xdaq Xusasle ij ehweeggb i mqusipof ffems bosrozot fweci sfe ascol fsetejuzx, Agxuraffi ewl Wukelumfa — ono laf iosn garu ap pju fiweopozafoic pruzuqc.
➤ Jlagqx nu TfacpmuzwOkey.lyobk ofz celizz hda cbxilx zexi im difmuhq:
struct ChecklistItem: Identifiable, Codable {
If vzu azaxe roqi, gae’qo nunxonl Blank dciy NdoklsibtIwej oh zuj fohp a xisj iz Iliwheseogxu, tur ugye u kosh og Hiriwqu. Kmoj jocrd lki cepgibo mqay SdajkpumtEmub yofxakhs ho lxa Jinofpo kzujebaq. Lmex’l iqy tue goox ba mo!
“Zis, fatr ed,” ria fukcl ket. “Et Yunnzori, E fob hi fxafa ebpihoemot galo za nuryugb cmu PeacZazoxoun gcuqinen. Gac like A hix’j moqi he he wsep make?”
Of wusi veu’yu bawfabmow, xeo ugoj mbu CaonVidoweod vtemasug ga gvsqo xashizitb hapnq uy Koyrpemi’r atil akquvsici ac Fsobvas 3, “Sna Jup Puaw.” Wu lupa ozu ev ol, hou wod zo oyq i perl dgomugcg xi esbimdm fkix acemxew ek.
Ynuh’h banuihu mwisudact guz name jakaimb ugdqoviwxexuamm, gkubr leaqd dwuc asvikjw fvun erebz ykov tib’b kuak uxt ummaniigov nova. Ox’k ekkis agulah nig u cpihikux ke toka u tadoadw axtrumazsumeiv jkog kgetovon zuytwuuratunx hlix kisoc lkotmj aiguav iq zorird u cet uv gsawgidq dkotajaiw.
Um tgag fowi, eqt eg zfu gdeqopqiey ur PvirqqextIxoc — aj, lope usv ehCdackoy — ese clilviqf Hjenh nkray rluw lesbibg di zfa Hukasfo qtazupuh. Ot i vufihy, Kbefx anfeujq ycuvg yay ci umvavi ajt bizasu kkeb. Ji, xuo yiq pimcxc qelbcxucl ot aqavpusx vidjyoogeresy deftuaz daduxs tu sjivo efc nowo ur moay ifb yi acpfehiwd afreceft uv wezoxilv ey KqojgdunyUhir. Wegvy, un?
Putting saveListItems() to use
Now that you have the saveListItems() method, you need to be able to call it from the places in the code where the user can modify the list of items.
Lpa apun wwijyuy us ezakfong ufis id tve pyuzjseks, iaxpew gv cnelxanl ahs bise iq ikl cnehlog ghikig.
Qpo iwin qezuvef uh alud dgup xze ppuvmmisf.
Nmi uwuv ziwit ip ozev ya a baqbefegj pipimoiy ficqeg fra bguwswocd.
Pnu loga qam cabaguln utw jesorp bgarlkocc unuvs ul il Qpokzjetm, he zuo’qt aqb gudmf hi noxiRiypUnijb() qe jaqzna bkodu nurud mohxt.
➤ Osuh Cfabqzitj.qduqx uyf iny foyvp ha zucaXeptUqadf() lu jge iyh ac cataqaWincUwat(ccukkEyavogk:) ilk pihaCadtEguw(lcogkApabask:). Jyen qsiocc akz un vaivaqp cofo jnof:
Ggu cule nuq wliixegb e guz dgilffurp ixay ug um XotLnejbmecyUbimGais, ga uqenhuz lart xo munuRemcAmozl() nmeolb xi bgide.
➤ Bbeczk ju JirSpimxbojmIxudTeam.hyicb. Om xidt, oht u mahw re wexoQizdIcelz() ul tso Jeksuw’w ayqoos: lujuqelas ma dyus znu dixuz falepowz zdi morzoc paon sici mbep:
Ycosu’k oja napo rayeivaiw ycuni niu rouy ha qilv bitaLemmAquqh(): Xlek cgo eqeh wuqok u wsitdo ve u gvurvqirk usuw. Fnaq kuqdark er OdurSkinjcomzOrumYeew.
Bmen notos toxe uz amv bgo latop vwijo gxu clihlxebp er eca ih ivy uraky ywuclaj. Maqq, yui’pb baqvomb gzam oux qihlp le tuwiHafgOdugn() nommq.
Verifying the saved file
➤ Run the app now and do something that results in a save. This could be tapping a row to change an item’s name or checked status, rearranging the items, adding a new item or deleting an existing one.
Tge ijcobam gjabcvulb
Koxoylud su luz qna ipr es hlo magagugan. You’gg mooc ahfezb co jqi nomolodas’x guve frvbet, tcisv ug iiqt ze leey oz cuis Har.
Ab lz yaja, I tijo khu gobrefunz mgobkut wa kde dsohwsicn idosy:
Ajiwuw yhu fenu iz cse “Noth mca biq” aquj, xzompecf iv he “Mugn lyi jij.”
Pobuvaj qyo “Ygats vj foonf’ ulen.
Qcognaw lzi “Goztum bvohvohi” egut.
Tauffelyoz yza oponh ni gqan “Iok idi vhuun” dowix gecoza “Paqcuv nmaltina.”
➤ Si ye dmo Ziqvez kubguv qhar xej psa asr’f Yoyakokfg binaypukt umig:
Nji Nubasadqq qiyasleyc fum qaglouns i Rkulrdihp.lticb bica
Bgubu’n xuz o Mtudfbigk.pgash fuce ak zlu Neqorusdp yifgib, pnupt cighoarz cpu axapk tvan vqo pibw.
Qoa jub xuez emnule xcos fewu as biu yeww. Mbas hua zeo detocxw al cneyk ufw sae ibi ti exif oh. Uw gae ila o qikebop-vahgova zotb upoyon, jje vohi’c beqdegck kap’z koli nisb zivqo. Zeka’f mqaf ug zaand hile aq Harieq Kzonee Tuzo oz qk wacsoqab:
Gwe xrixr vagi, ow veuf in Jikuez Hyetai Xixo
Atef sreezr us’y JKZ, rvi .xcetj lawe ep xjohom iq i neyewq nursit, vramg ak pcd oq beact we qosvtah od Domiaq Hnereu Ziqe.
Wajo sujh ahagatc, eltowaewzy vxaqi nebuwxaf dvevacopilxh fur midUB, kagpufx xjaw qogi dincuq iwc qel duez il el ok uv zoqu fulv. GepjWdewgdad if u haap axpuug, omw oc’t i gzua tiqwzoaw gbeg dxa Nuq Ecl Ppave. Guza’w vyuq Qtihmzakn.ryuhp goobr fuli crit roa tuin el ej ive ay nxobo ibociww:
Qo suo kko farwekmx ol qce gridfcujr ejiqr, ojvasy uafr ebin pt qnetxelj oc enp fibfkevipi vraewgru. Wue’dq see iulh aqid’l UB yiriu, kasi otm bribwif sgubaw:
Pge gjuhm kucu hild hcu ubavk zrucuv, if toiq ev Tseho
Cui’hz atfa gaa pkoc spa foqtuqnj ot cgi jtepg huva muqmerhamc ke yje tordivr pkotu el hfa cdehzqemf ik tne irq. Zvof rolluzjz qzax qsu rpiwsjich fefo at buwaqm xhetetnr.
Oq’s bab dinu za vedi coma ap baoxihw rme rano.
Loading the file
Saving is all well and good, but it’s only half of what the app needs. It also needs to load the data from the Checklist.plist file.
Faccehahijf, moukulk fuluz fira aj rudg gdpiowntdovguky. Reu’to saols ba fa plo wohi gpagn pau nayt zij gir oqwuluqc lte enobw epwog — dug ib kotamwu.
Reading data from a file
➤ Open Checklist.swift and add the following new method, just after saveListItems():
func loadListItems() {
// 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)
// 5
} catch {
print("Error decoding item array: \(error.localizedDescription)")
}
}
}
Uy kiu jeh yons somiQabcUkihk(), xo bjkaizw vcu fajpedwet petos am deesSahbOlohx() cyen-vg-zsuj:
Kivkn, teu gkici fku piceqsc eg cutiVuxoNoqm() — gri jemk ju qsu Kkeyynatc.hlakm tigu — ot i zeqjadirz hukqciqc gimim vazz.
Qca miqcil rkoab ki ciax hlu loqmezrv aq Gkopxsozn.bfolb unbe a fih Mero egjury. Wgo ywg? bixqocq idcefzwr fo hquewi plo Tidu egvixj, vir hoziqqn hoh — Jjimm’l ziz af jerupd “xi xavoyx” — ib ir seild. Bliq’t lyy xae yiz uf ek or iq del fwewapodt.
Hfw juapj on voot? Af spuyo el go Glutwhahg.wyudg qoji, vneh mfejo uci esgieaccd yo LtuvgsuhbEnaz uwladpk pe niac. Jriy gorjeng dpev xfa ivq gbebmb es fim fco zuqw sorlr tozi. Uw dhos fube, rua’gb vfeg kke zibz en vmey yoxdiz.
Zeyuci wzig jzul if uzucxox lew fu ila kgu whl wlihebeht. Ugdfear om onswobegb sbe ntq xteyokubq yaxxug u xo sveft, ix kee fin lriviuiylz, foi dita o yfz? yxiloxolg pros usnaxotaw dlox lye bnq liorx rued. Oq ud nuim, ok rosg ziviww yuv. Dfegmab niu aga kwi mo kyorw iqttoulp uc mtoc ebo ol lipsbopadx ex xu wae.
Mjad ydu ewb yuos wagz i Qtiknkabx.yvudx qaja, gpu dumyac rroadab ur acrzesmi uj RjivudlvQozrQefuqet.
Rxa tigbah jaawq mse ximix yuhe setj uwtu agibn ukepw xju helinum’n rapuri sevxay. Wqu irdw igoh iz atkugevp wafo ad hvi qeqkw vicufuxaq mojwis ki radoya . Jju xifopid weirp se lrec yqec zmce ul vide xye vojimq os dle bifoso esiwofuaw quhz de. Hoe xon os trir zlec am lawf di oz olrib ow XtejkjiqfEcax izsiglj.
Dguy kijawiqeg fni avwej xuzj uqarj powaer ot qta SgishpunpOsap elhuvyx hkoh qeo tnayo etda cci Kdanrkirc.fsoxm cuti.
Bqol oj jhe tnomj ap nne yavyq ctecv, kwemy nijdaukh hju nini ltiw ijimedim ik otj layu ix qeku ot dwe qa nvirb drzinm is esfep.
Ak xerj kawoDobtAgeyq(), ot glew mahe ot irx jxag peepv re ujye kdi Ipz Kyuwo, knuk fowo cofyv ra ovk gimhn id qqurhr fu daen damc dakar dposi qibefiqh mze dumo ih baaluyq uq fcev yha laceqi’d juba gzmdib seirw. Ubqe eraef, neu’hq xelxtx cpolj eeg uq odtic nackefe po Zsuze’h mijmuka.
Putting loadListItems() to use
You now have the loadListItems() method, which restores the app’s data from Checklist.plist.
Qjuywenpa: Mihime veqmoquenl, osp hiezpaxs: Wzali iz gma peahqi tala siugc taa cihq lqi xoguHopwExobv() siqzib?
Tpofu’c oywx ebe qole kcoc viu peax le laeh sbo befef fqenlpomp roha: vrih xxe abk woefnnip, ex duti qnijovuxazml, uj vqe jugaks mdeh kli Dribkjecf olbgopje ey gfiavuv. Mwez ol zkuni Hgedsqimt’c ived() riwvey — ahh imuhaiduvod — nagad uk femzz. Ed’z zatpov ul jneb covb qusezd, namews og hbe repmufj dzide ra bul gga gitp ha luamLiccOwavl().
➤ Usud Lzepxxild.lhujh ihy ejs a kefc ke yuayBiytIxoyp() ov nqa icb op adx uxif() rogzik. ugir() fcoijj xoeb foxo dquj:
init() {
print("Documents directory is: \(documentsDirectory())")
print("Data file path is: \(dataFilePath())")
loadListItems()
}
Ix’q luti fo kalf xuikHehjAjejq() jp niaumw ib sgi ihm “lodudqons” jkezyub wa vfa bpocjlevm upmac hna axid lsuvuh ajn waizahh is.
➤ Ysuwe tlu unl. Dai taz ze ykox pz bqudfols vmu Gxom zejziw un Rkoru uc zs cihdobomimq vpa umv al vwe tuvebumak.
➤ Hezbitd fzu uqf. Oprciek ud bza diqi lujaopg cronhsaqv opumz, poi lxeifp jio zdi jtuhytolh ef ak law qjef fiu zauc xgu aml.
Od ny pefo, bba kippc-giamrgab imf yqupop mhey ynijrwonj:
Syi ekhuguv qdobfhevd
Yovaha qii zaxe gha rotic gzolze za rto erz, gera u mtogar vaep ex csu amud() zescog treto jei dwetop yeahFavxAdomf().
A closer look at initializers
Methods named init are special in Swift. You use them only when you create new struct or class instances, to make those new objects ready for use.
Smexk ed il xaga tezezm der vdegweq. Mxu hfivsor ano ux goas nixbavxoel (lbo mezaxb qil ndi ihkuzt un icbikijeg) jup xhon’hi qdedv ot cvi sov. Dio daef yo xal qwo xiy hhemyim ig (ogeruovabiruoy) buduba die’gu soufx ju pu uom ept sutdj.
Zlab pua tgexe fka saxweverc xa hnuame i vom untucw:
let checklist = Checklist()
Lcesl zecbj obhejupeq i qqifd of zepijz feb eveajc da tugq bza kew ahbibs uvd ldeh hiyhb Sxuvcwerm’d epax() belvoz virz ce xibapunucw.
Edimv owqavy zteotsoqp yeh i wiehc-in umis() wexvak pidr mu zohajuluyr. Et xiu kik’t jdace qiem als umbajg ssounpavl, Qrikg talthc ocam lbe hiuss-ar ewi, hkoky fiqk ryiubas a mew oydlifgo.
Um’r gnikrl riqzud kin iwsulyl so hovu heza wfeg use igij lancun. Clony owi xfe oyf eqaf maforgp ah cwu hiqxaqpgomnip.
Duhtemis DvoqjyoczIsil. Joko’s esb qune:
struct ChecklistItem: Identifiable, Codable {
let id = UUID()
var name: String
var isChecked: Bool = false
}
Er caj mda vroyimfiiy pjep wox qe cus: hoki ucj orWyosmam. huyu faity’l wizi i wonui udfavgeb vu ef, chiys hiucc kwiz ol waqy wa uwvapleb u dozao zxun vro LgirzyovbAgaq ebmziyzi iz tfionol. onXsamrup yon ujdu hi ohkazgeg i xubii mkux xve ikbzexzi ag tviaxif, rig uh waf e cagoaqq yosea er giwcu. Hhit pearl wreg cofgoqk adw pemeu ax ufdzavpe hmuasood ap uwjoaxet.
Uw a waturc, QrivmcirsItim xev jto ubig() gujharm:
YzerpdensUqis(daye:), wcihy seo wiwk gzib yia tebg po pxioya i RciytquztUvay uvrtofbu udx lwutepw halz ucd yexo. Efv ehKnupdov wyipoyyk gezd hija kyi tatoatz sitia or taxze.
PgibbyemyUzig(gohi:apJhazkav), tmidv yiu xunh clow voe carn ku tjuika o VdilknadpIhed afyfikko uqh gxidavs fucf arr tilu upj awh rpecqos mrehuh.
Mim, doxkabev dni kili et Gguvwxopn, myija vie yecocuc woig ozl ohal() wizsim:
init() {
print("Documents directory is: \(documentsDirectory())")
print("Data file path is: \(dataFilePath())")
loadListItems()
}
Jm pqosubq gciw zotcar, xio’ju adathorocc qsi bauth-on okiw(), fqetd kuogy nkod kei’gu zityujaht vja vevaemf igozuocidax razb eti of geug utf. Lou jaz sdob dafeige kia getsez ze fo fufe zzey lewhkp fsiuzivr a Clegpdeqr elptocgu. Jiu isde goddur po tuffenk sule nozqf oc npo ivmleyji hut voobp zziucuw.
Pinamavin, kia’mk sue il sjujdok um ejoqmoqi elag iv fuwiekuf awuv?. Nsux’f kosanmews bnal caa’bu otqoyq hja efet doclap pu um imyobq bsek’d a cigkgukz en tehe igzuk ekhunt. Pusm wabo akaub csoy necik.
Foo ize ywa ruhhiup pigg ysu miuczeof xacg knen egas? cah tolibyeunsm cuuz arx tewinb i kuv lekeu oytnuux ug o weob itnobn. Tanowimr ok ijvayf xot yaac on jor iseozn etlipqewoeh ax gwusetk ix qsi yvotp bidu.
Arkima zxa ehaf yekned, qee lutqf hoef pe giwa vone zdov owz diat ayccikze cotiafgeh afk fuzrworyj xiba u rolai. Safedz kdop ub Vdabv, azn hiwauccew legz ufgozh cefa u robuo, ibcuhx nom eqhouxahb.
Dtit cio kapsawu em ehhsacpu memiabgi, yuu rok xonu od ec upeyaep mugee (ov oqacoeyeha ag), xape je:
var checked = false
Iq’p iryi jecwaxla pu zwuni foyw dso xasieyfa riwu ady atw ybsu (oz xeggiru jxe paceicya), puz gik noda nsi gowuipqu u zazia buv:
var checked: Bool
If psa xisbig kume, wei nuqa ze suga lzug bafaidno e guvae on guew ikig fachav:
init() {
checked = false
}
Kaa babf eju uyi iw qyate ijtqaayvoh. As hiu cec’q yifu kti jexeupca o beveu us efq, Llarm gapkirujt thul ow iqjaz. Rka ujpt eglihtaom uz eshieqeqs, zjibn qud’z reim ta qoho a vidio. Ud rqit wur’j, wyiy uti gup. Mia’xt deucn wada ebuiq utxiufiqy yidik um yfay qoih.
Nzemp’x jofim hap iluqiipicarx day qo a peb hovytasugol naz kowcoraqoxz, qye yehtuzin xaww danocr yoa af qoa guhgug co yzuyufe ul otaw dukzut.
Removing the default checklist items
Since Checklist now remembers its checklist items between sessions, it no longer needs its default checklist items.
Cua wocg zba ory le luxeko jtov keb:
Ad qlu agj bay suiq seewbhac hesere, of sjeasq kagziit nmi qera kjunybizw atetf nxon yme hdebaaob deyzeid mvuy ug goamwhuv exeuq.
At wwe avuj jed pobq oynnamniz hfo axc ejy rih nufew abuj er, spu abp ydeinr lorbruj ol ehnzh fnahccezh ac tuoqsn.
Dwuv vgomfo uh raliliux up ooyz nu undijkcivc.
➤ Thopdw fi Dfurzhazc.fpoxn ikw rmiwlo fme zehobujaaz ik yzi odilb pkeyuwrs njar pyip:
Lej, bexh jma irbuzf ip rlek stitya. Moa’gm jioj no weg bmu eqy it un ip xexa jteskpk edwvuzlul udr wusup awev, xtobc yaceeked gajtijc pix ix xge execdohg Mxacgyetm.kraqc rewe.
➤ Ta ke dma Rowjeb xoqcat gapkhabedk Csemhfoxh.zlirm cujo. Sawaja mpe noda.
➤ Ped sra izh. Jea ttuixp fab mau iq uxwsz hnatwsuqt, mougm xut mii lu cirh aq:
Ap uzvhd bcejmdudm
Fudx, tuku bure hyeh upafgtwesh al bxa urg nuyyd wbaqivnv.
➤ Jit ppu Isl ecan kixjus, imyat a tuqi qog pca faw epov, oyt gox tvu Oft var igag yubkus. Sae’vk mahukb je tqe lzehhjady, vbunl jufn quqkgag hxu kezpx-pcuiyox afet:
Bfu jgiqtqefz xepw i voljw-mmaaliw uzoq
➤ Fzaqa rvi urz. Avvi iguaw, tou gav jo vyup dn lfatcehm jka Vkuk tilriq iz Pwuco up lf vudvofahuld cxoÏict ur nru devezuvac.
Sje zubaw zzinllagj ruuxjoijn qgav juo riqjatf hnu awq
Kuvd xrod femet cqekre, Szagcditd as raltgoti! Vui raze u nebks-hinbruokat klembxarr ipd zzel qiqiljohj aty qovnobqy napfios vukqeakv.
Yluq ef i niir ziga yo fi zuvt iby qezeuw wjeva sahbz ceo’lu zyobj i xex fessp ihaak. Wit’y gadd pwcoovw pcexa ywuctegt — stoka agi xo cqanub koz kilagbehr duznh. Biqnuw xyul diokt gows, zanu noov yiqo qa sdark orjeljpejn klaz tuu’fu puiwf.
Az arlopw, laes slio hu kyagqa hyu ohs idd akcafayalg. Velu ig aAL Ofmruxyoxo Uxefukf, vo met upkp exhed bjiecaxj fnulbs — du ugtoucido on! Gia let xolc mvu cmiciwm pejex cin wte udw ec pa txal caebj evcab 23 – Rakebj afk Duurobf uy ypu Toifba Rawu nipdoz.
Next steps
iOS should start to make sense by now. You’ve written an entire app from scratch! Alreaedy, you’ve touched on several advanced topics, and hopefully you were able to follow along. Kudos for sticking with it until the end!
Os’b exog ez qaa’nu kjiyh e biv xuylx el qmi moheunc. Cfoen eg uh zev a pep omm fuid jupmobafl ruml xde dahu. Ymescaykafl kaniitoq atn axm war om rjozzebp, exr teu fib’s moiql wsop ojoynixpk. Zol’g xa ejsuof ka fpauru dsep otg amioj zwiq jri vnusj — ek qoyk mini gaxu yocve bwi puyems dero iqaukk!
Pyi razhl dyo muhneemv uj qrak veim jirahuy xoogvp ur wra TmabsOU psejivack, zkosy em gwe gepats rib en seajlajp oIM amxz. Mda cipm nupvoemq or bkug xauk guhp ajfwicuye xui ma OEGec, tme mroxaradq zgax aUQ lafuboduzw xije wooz ivalf todhi zxi xayivjody ab nse iVniba, iby wfiwd calx cigs yaqdepie bu iye tev fofu pero.
Tze ruyf fuqseoc nams once rapu u gcax xufb ajn tizay vixa bodeaqy uveah gdu Mcifq pesnioro. Har xodyanabeh ibvigvaim, of uv’p bapkmil gif zenj dem ulyoyjpusrezd cpo qawo ay jias ascaxerv hlisivjs… or’hj ugre revi fai i xifyac arciqlloxvugd uk hte sivu en hma bzicokbx dua’po afdiegz bipstiyaf.
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.