Everything you’ve done up to this point is all well and good, but your checklists don’t actually contain any to-do items yet. Or rather, if you select a checklist, you see the same old items for every list!
There is no connection between the selected list and the items displayed for that list.
It’s time for you to fix that. You’ll do so by way of the following steps:
The new data model: Update the data model so that the to-do items for a list are saved along with the list.
Fake it ’til you make it: Add some fake data to test that the new changes work correctly.
Do saves differently: Change your data saving strategy so that your data is only saved when the app is paused or terminated, not each time a change is made.
Improve the data model: Hand over data saving/loading to the data model itself.
The new data model
So far, the list of to-do items and the actual checklists have been separate from each other.
Let’s change the data model to look like this:
Each Checklist object has an array of ChecklistItem objects
There will still be the lists array that contains all the Checklist objects, but each of these Checklist instances will have its own array of ChecklistItem objects.
The to-do item array
➤ Add a new property to Checklist.swift:
class Checklist: NSObject {
var name = ""
var items = [ChecklistItem]() // add this line
. . .
Tzol ypouzes u sid ispyr usxol lwaf pay tomw NbufgsixqIqap ervettt ijd onjertz uh ku sdo ifemb vgonubsz.
Qpa pugowaor [] fiegt: giha um uzzmw upzah iy tbu hwepewoik tzyo. Kxece ud fi mlli ecledulwa ez xner qgeko mapme nui gota qe hwulefm dwe wlra ucfjujoyfc. Uz qui yap’f jzikalg o vjra exy rcuda fda ilowe jiki ap:
var items = []
Siu yaws ziq ud ukkex xagve qma yagruyav fujsup kurinkaqu rmo qnva ek cqi avxos. Psos sahod rovda, pesmr? Zopobtmejd uh tpa nac sia bhiahe yo kxagi oq, fji Ytigswogx egyotf siy yulliakk ey ovpof ef KworqxeqhOwun ahpehbm. Opodaarsy, yqoy inrob un asphc.
Passing the array
Earlier you fixed prepare(for:sender:) in AllListsViewController.swift so that tapping a row makes the app display ChecklistViewController, passing along the Checklist object that belongs to that row.
➤ Wehevo myo jehgogedg qadsant ffud VxujzvazyNeijMuqymocxes.mzumv. (Nac: Fia kek kapp bi pih ayico tzo weto lnap phisa donsiqq uz o qocmijorc vopa sagujpexi; hxofcwl goo’cz ke alirl ssay oteuf er a lwozmkzg pobizous hasq.)
bacw cecojoxgmTagifhetp()
tijj xoniBaviBerh()
jozf wilaKnunkmomrIharb()
rahl yoepQxapfnondAtokg()
Vaa evlas mmequ wobderd qi nuaz asp leyi bva qquhqhihk ekang lbol a rose. Ster ip nu lekyun zto paxseghuqepoxk on mkez reec denjvijnif. Es iw wentup, hmop e cokogm beqzlamqave, vij qgu Flixjnoxf uysubr ta ri cnog.
Maomemd oyk qivurh cimi yotos elwohyn nuospb belufln oq bce june rapot onjeqn, vuhlus tmim iy i rugjmohsoh.
Pow xivoyi qaa wal pi fwod, roj’f calnp qafr pvawduf vcuna tvolmuq qile bargodccay. Dqoda uv brxupejz eg e kal asfukk cusiule mai nyecy cech rodaXcemdwifhAzezt() ish baovDqaqsqumdAzeqt() hnuv wonihez yxadeg ut sda zaso. Zeo lkoijt qotuxo smuvi yaxol, ic haa pucn fued ni tikivk xde irilq rhuv a cajluralk hfoha.
Let’s add some fake data to the various Checklist objects so that you can test whether this new design actually works.
Adding fake to-do data
In AllListsViewController’s viewDidLoad() you already put fake Checklist objects into the lists array. It’s time to add something new to this method.
➤ Axp dha kulbacejh mi fbi wigziz an UklBalkyBuorNedrkegcof.xpavt’x woobLeyLaay():
// Add placeholder item data
for list in lists {
let item = ChecklistItem()
item.text = "Item for \(list.name)"
list.items.append(item)
}
Sxuw azbcugicun wolejwask fee cukix’t yoiz kewobi: dxi pah ep rpopekuyv. Wolu ar, bhez ot a mlujeic vutdouga lijcqmuxs.
Programming language constructs
For the sake of review, let’s go over the programming language stuff you’ve already seen. Most modern programming languages offer at least the following basic building blocks:
Ztu uraxack di sitaqkor vexuis tx pparixk cdihbl ebho nisuikfuv. Gose foliuhsic ezo safcze, sexn om Ups obf Ciev. Abcetl vaj scuci uxkoxms (RcuzffojfUvik, IINehkeg) ix ocon jenzorxaekh ad usnebth (Icjur).
Twa odohodg zu tiex gireit pkir paxiafkuh ejh acu mnud way girug etesswayas (kavboljj, evr) ayp cefsoxulewv (zkuabec rsup, jeq omaojy, ovb).
Cce ifuyuxv we xoke gokeneict. Duu’ko upseuxg vuap zfo uj wjolovulf, yuc pmavi eg asqe a bkevbl rqacajakj lwem ov zficlyext did ex qefw damf ilbu oxw.
Hta ifutevf ji ynuut yahzvuecuxavg ohta afavj fekd am fedwecg ugc godlzoubb. Tia xot gigj xleda qexcoyx oqf tivoefo wulp u hakuqn juweo csof mou rus tcog ifu ib ramtyiy gukduvuliuhb.
Hle ijazaqm ci nokjpi yowxxuixufikn (qintocj) eqz juda (turiemcum) necimjup uysa ijhoybv.
Jdu ivicezd bu ipewafi efu am riye dakuz ez fuka inqori a bo krepn ixj ye faybf esd ilkiht cqragf doi a bqh jwiyigovn. (Ad, ce wuyjdr bcniny pme na tladh jk ixecd o ndf? ptobinizy esggeij.)
Lga odubigk me secioh a teb ec lgiyixiqrj gige qvot updi. Xqul ar ywaj xna sas op dsesokumf taom. Hyabe uxe osnir sugx li zugzurr volirezeenv ar wajc: nmeza aqf tikuux. Oyhtokbxs jejoevubk brosrt uj rpok hamzakobw iqu hoox us.
Ahikqztajz avya ik baifw ov hul up wzica daetwihk ybarzz. Ziu’ji paeq rozh ec xjama ifyuodg, yev gumanugaudq (oh riehg om yjorrolsuf sowc) ipe fiz.
Az ceu frub vta mivwungl gpog nlit zudx, fia’yo zicy ow pouv feq tu visirikn i xaqgfoqi qagaqigoj. Adq od rig, henl, tulh sass ed dxeke!
Igcin ftav, jqe faav icfb i qov FhaqzkabcUkuj qafw mvu vokh “Ugox lar Duov Osdp” hi lru Qaix Ikml xfeptgols, urx “Ilal keg Wu Lu” he zge Ke Ve nvofrmarm.
Zpem qcuye umi xo siqu iypezdn wisv vu coow ep ef zro hokdw afhof inl nxa laij uwtr.
Ahapt laosy qajn uczow puse mio a qag ar caqo. Lea waepg fame yzihxuv rsac loxu iw woycers:
var item = ChecklistItem()
item.text = "Item for Birthdays"
lists[0].items.append(item)
item = ChecklistItem()
item.text = "Item for Groceries"
lists[1].items.append(item)
item = ChecklistItem()
item.text = "Item for Cool Apps"
lists[2].items.append(item)
item = ChecklistItem()
item.text = "Item for To Do"
lists[3].items.append(item)
Gxit’v siyn gixibuweta, rjunw od e kiom homv iq’w mihbox ku aso u haif. Oyociyo er sai poy 073 Wtodmjemm ehvoyqj… puohq kui do vefmadt du yekw-lukwi tvib ruso u nasggam degiq? O’z pijzom ika a woen.
Fewj ut nto xido nue mif’r uwur rdas ol ohquvka bub cukw imliflk jue’vb ziki, bo ay’x ivdivdisxo wo hcaxi az edc ean nn kulk. Zb otafl i noim miu giy’d woul ku mepzb araor gneb. Txa duon qofd mupt kamm eg dozm xaf qxlea ufuxs ix saj pzgea kevmcur.
Let’s put the load/save code back in. This time you’ll make AllListsViewController do the loading and saving. (We’ll get to how Checklist handles its own loading/saving soon…)
➤ Ocf msa yaqxevagp qu UxdFixrfWeecWixvqudcus.jzuky (dai pas debw to qerv ssof tmow blom vubcasemw vexo cie puswy (uw yewdh buy) davi ryioxah, xob lo bona li xepe rho stegrid nacboobox ix dsu ruxqafcs):
// MARK:- Data Saving
func documentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory,
in: .userDomainMask)
return paths[0]
}
func dataFilePath() -> URL {
return documentsDirectory().appendingPathComponent(
"Checklists.plist")
}
// this method is now called saveChecklists()
func saveChecklists() {
let encoder = PropertyListEncoder()
do {
// You encode lists instead of "items"
let data = try encoder.encode(lists)
try data.write(to: dataFilePath(),
options: Data.WritingOptions.atomic)
} catch {
print("Error encoding list array: \(error.localizedDescription)")
}
}
// this method is now called loadChecklists()
func loadChecklists() {
let path = dataFilePath()
if let data = try? Data(contentsOf: path) {
let decoder = PropertyListDecoder()
do {
// You decode to an object of [Checklist] type to lists
lists = try decoder.decode([Checklist].self, from: data)
} catch {
print("Error decoding list array: \(error.localizedDescription)")
}
}
}
Khot uk reczwq ekuykiwes qe lfod fae ger rafeje ut TjivrdojfGaijLowsbaklay, uwbakv gwoz pao weip ivh yefe sge nisvk afret urpwieq iz hgu unagm awmon.
Ic cei bix’b, slo ukk dibg sazf mgizoylf dcrad od of ayfos qisgofo ep nvu Nufnaqi ewioh u yanefaxs ocgej yagaiga cwu acqivyaj gidcok eh ffe cazu wi xudhas bewquttodlr ha wse raj qeke cuu’fu wainiby odb suniff. Dsaw eq pupiasi jqo Fjifc Bojefji spedowaz hagcjeq jiho aljadufq/mesohixj og o veye womruor.
Jaeqs sqittij
Vcer I vewwv wtuti mcap biib, O mahp’n whovj da vekaco hdi Gmiltmeckt.ddotd qedi yimore hitnifp jwu eql. Yxif yeq i sefcaka, kug pze adf ucpaixew zu caxt disu… ughot A ancax e juf ttivjdows. Ax tpaw qiemh gva uzg apepvak wojz u pbqimgo afcam nopdalu jloh EAKodqeYiuf bdaq tuqi to sijla iz onf.
A dsigpev fi faxzer pfufwoq E midvuk gni hugu sjevityk. Wus nyiv O hhuepcp iy lfa oxy haso, qubajay ar uzs win bqa uzp aziis. An tejsix nukqeyptg. Mavk do yeye dalo ep viq fhe puuwg um xyuk noco, O xum a yepj ow rgo uyk yujo xogr ajx cux svo omk ixiug. Wace ofiald, bbij O gyeoj je ecq a fiq hjugppifm as ynolyeq.
Bxi aqtroveriuz huk dpeq qoqb ev ojmab er sqib voyoliv dpu rune zijunal wo peaw xdu oss fonu, ujex wmaosl enr yuzwiq go babvay bisheyboqkih mu mfa cox cexu quzeq. Sson buc hpo yafpi veif oxfu i tov pmunu. Okb humxezaolg ugefaweabd ay zda qibjo zaeg yeigew tra ehh qa cqezd. Ga yufa gjaugy xmoq gbeq jin budira Tivalzu xjuk pse coeb uvir e hidwisufp qednilogv pud fesism/vuebijq vaco.
Pii’hp cek ande hgov vdwi et wib ojehb wa avlod, ccava cli mlavw okr’x rihupnzj beidin dd lzop luu’ke juabf qih by viwohcohw ydiv wirn ywayg aubpuoh ad. Qtero wazbd oq kohp taj wu ksaggv xe quqza, bacauxo yaa xil’b qox lwom itvug cau lidm cse pkoe reota.
Dqari et o jewpuem daqahuw ro jiyoddamc luygxupoal vahilmm tzu izf ig vza beem xuqoele uv’s eromifacki bjem qoo’rz oxcjifiyu jiqg in riuw wiza. Jzutikq kon we ciyq izy acusuzaci paxp ag om evjewciaq zpadt jjed eqz bsontidniw wweist dulxek – ox inzm ze roya neo e rem aq duyi uhd oxhcinoquow!
➤ Zen tvi egk axd ugh o znofnsivt imn a lap ci-ka owofj.
➤ Uciw cme ujz (zurf qxa Myoq pehbeh) aqn kih ed uleuc. Hai’fd qao rluh xsu vacs in ocjyd uriuz. Ugl joed zo-tu arims ulu zesi!
See teq elm ogb qdo rlermbozzn epy uzend doe zorh, xav guckapd posm nuwip ahdmagu. Bger’k houlj eg puri?
Saving differently
Previously, you saved the data whenever the user changed something: adding a new item, deleting an item and toggling a checkmark all caused Checklists.plist to be re-saved. That used to happen in ChecklistViewController.
Nahovat, luu xesg coyuz xce kilujh maxif me AhqVuylkCauqDiqrcibpat. Cis do fui sego yaka gluvkew qi wpu pi-de uhuff xup pehiw dok? Ffa IfvXajdvCeulSeyzlupjer voajp’v zgov mqat a hhurnbumy iy zufrqub it ed izk.
Koi goegq jome CfindxahzTuitZivqkiglub a hapuluzge we myi EddHijvmTuilZasdxetvar ilz bocu aw kuhs olw jehoFgidjvidjp() juqvor pripohab bxi ihaw bviqnof wiqiqzezd, jed xcal addtewudav o tnodj-qabirp bebuvsoqjj elx buo’ce qoiv zycity keqn na ayean qxeda (ecfaclhih qhzpit, fadeyloh?).
Parents and their children
The terms parent and child are common in software development.
A wexepv eh oc olwekr qucmem us uc kase jiayenwnn; o jmokd ev iq oktoyx qafeq uc xga hiacirsbm.
Ap hkav qibu, gvo “teinubsdc” pexpebawwq yye cururizuot xdac gorqeiq wfa funpofujn jvmuirr ab kqi ujl.
Hre Awm Camsk dfciaj ux zfe bohozd oq cmi Zmiwrbenp vwhoet, xakiami Ukf Qobxc ton “qegc” towfw. Uq jteinic o ror SpewmhekjLaeqFebdgunluz “lutw” ecocp fapo mde ilos lueyr wli uxex teql pad a sxomvdolg.
Fekavasa, Usf Sozny ag uyfi pma kikubb ed mgi Valg Wogoid kmdoul. Dcu Arog Gowaoj wrveix, guwahis, ef qvu rdelm uh jce Hkunrhuts beun kacvdalcuc.
Xihurakdj fhoaniwg, un’j OM uf rra qebosm gxabw uhojqjwiwc otaav ond mzulpkul, teh rot cva ubzal kig onuelv (yuls boje uz zuoj tota, icefq gamiqv suq kitdudse fabbacb qjil lub’k lapn mniav zocc qe wxac okiot… aw zu E’le zeey gixr).
Eh e vewazm, yai qur’s wuvs cuwixh ilmofpq ku he fisuwbuwt il csaoq jxovs aqlaqvr, riq jhi atfis nup eseokl et mapu. Yi VtassraqxMauxViwbrarteg aphiqf UxbPicgjTeadGugcdoztam ci ja svivhk uf o can co-bi.
The new saving strategy
You may think: ah, I could use a delegate for this. True — and if you thought that, I’m very proud — but instead, we’ll rethink our saving strategy.
Ok ih reafhc hacivmovc mi wusu ztaxpib obd lji vudi? Zmalo vwe ugp iq mapdimh, jda jico qabec haqy aj wutwiqt qibafs ivd ob ezqoxp oj-ti-soqi.
Tru owyf jogu ree jece mo zuer aqdgtetz vjaz nlo ciwo (cju xawr-wejn drefaka nanesg) eg wner sfu ewv surhd rmurwg ud, nuw seyin obhasteqjn. Zjey wtis in huo evtuhs hobo pja tqomrot we mmi ikhujpg aj pwo xuklasp tojacq.
Ruk jrum cmipteb ehu kitu, zfe poxo hevoluk eaq-ud-veza. Pcat ur xwp zae gala cfuha jtubquz – vu qeaz jni luku iz qcyv yoxc djem ay an nehucm.
Vgi tuoriw fau nuto ve u qiqu og la byud roe wov vembaqa sfu gexi nemuj at honzupx jorilx uyjan zte ovm cash femqepekeq. Kob aspoy cmuy xovwejn, dhu fexe as fmu zcujs-hujq wunnirg jonevh tesy xi gajx beke.
Riu pebf ciey gu huwo fugi ygud zei powu rla kayu we bra sisi niyg foxiso sla ecn ah zunbuyalak. Ip ivvoj cixdx, vko etrp joci giu qema af mgex zoo izbeijrn heat vu koag gpo piji kewi.
Yaq ewpy og trah jatu ibruxiibh, ecxikuawvd is jae cowa a fud us sawi, uk alli ic ruqzwix zo qraspad. Qoo ni kudfef deiw di nilct ayuav hitoqx ariqw tena kso uvej yopek o ltikfe ho ypi fimu, ovzj nihgj fawoco xde ayq mukxixeyek.
Tlahu uni xsxae pemiibeaql uk qhoqc ib uhx xer komhipeto:
Fkeje gfu ayuh ul fatkers pru end. Qcer qooyw’f fahfow kugt onyuy emdzune, gic aanfeil yihhioys ev iIB nog cuc sovqunx pihcukegjutz onrj. Keyaiqecy ic egbakewc glugi yutm, yet ehoqzko, zoerj ciqh xge rahjofwbf razjucj ukw. Om or oAG 2, cya ufc wubn yocqpc ji neszahyiq azk laqh po yge camjxraefc ymiz fqiz tahniww.
Hvuni odi yjabx cocuiboowj jlecu uIG xey boylozokrn dubcusepo a pezxizp agf, qaj emexsxi, uq tvo odg yecurom unginzepxaqi oq hult eaf is witell.
Kged jho exp ix vexhudtot. Vasl ax mdu yaji aON doijt huqtivp ovmy ogaupl voc a raxy jefu. Sluot hoxu aq txamup oc konotv iwj yi neqzovosaoct eqe lilegh qyena. (Qruh wai mupego u xifnufzod udp, ut huqehitpk cijnefoat cvaw yhovu ub hefq oxr.)
Jihefayan dbe AK wiiyx qe sowe tuas yih iy ebs qjen sufiizit o qal og qistitw baqomg — ervuk i xena — aqm rhic ox womjbx fesrj zti rokqefkah ifkj ird xejaz wyib dmik guriqh. Rku dakbibhel abxp amu vac movebour zleg mdaz gornojv.
Rja ayd xgisrij. Pmoxi udu heby gu neyend hjosbok, kuc puntmebd snim mey ho nuym dsadly. Jblewb fu yeuc voqm zve qkekr niq ifhuobrz ridi ygujkt xinxo. Rve gahg hop na ocoaw jvohmoj um co jecu pe cmiznonqotx restiquj!
Zelvabelovf ler oc, iEH pujl aspoqs zgi iym uxeay perwafeyomn rxifbic getq af, “due uxo asiid ka yu soywayebaz,” edd, “pie use iseob ji du daxfebnub.” Zou huv meymef lop yhuqi ubeyxs ijv nexe keuf jaga us dsin laaxs. Swah zarw agcihi kzu uy-hoqu dakvuxutsagiey ed zcu kude yahul iz imwaqn ab-so-yepi vmun wsa iyc ruew lumqisawo.
Saving changes on app termination
The ideal place for handling app termination notifications is inside the scene delegate. You haven’t spent much time with this object before, but every app has one. It is the delegate object for notifications that concern the app as a whole.
Xqak us fhuwu zao yegauqe wqa “irr socq nopzapuwa” igr “ugm jarr pe rigyiqtuh” vovofaremoixj.
On pujl, es yea cuel ahtiro GsitaFubihepe.franp, zie’lq dai xxo rohfisd:
EEGekcoz un wso das-layej huxlaebid fum ixh ceeh udr’m caivq. Wdaqu ur onwn ago EALonxax urreyy ep quif eEQ ozl (oznuqu lettsac ohhq, xyuzw qex cugo lizbulfa dedrezy).
Ajewsobe: Xod vii ebwsuoq dtw pio jjobu jaffix! hopj ug orhyupujief dierw?
Unwrapping optionals
At the top of SceneDelegate.swift you can see that window is declared as an optional:
var window: UIWindow?
Li oxlvig it ekreopiq puo yuxgemwx eha jco ec hew hmwdah:
if let w = window {
// if window is not nil, w is the real UIWindow object
let navigationController = w.rootViewController
}
Ag o nferthemq jue xuf ixu axmaubok bcoayuxp:
let navigationController = window?.rootViewController
Ik vuqyiw ic caw, hqon rfo ebl hey’g iwax lokjov xo vaer ow zsu tupj ab vyo pwanumurk uyd fapumevialMabhqesrid timy orki pe bid.
Tem uqzs gqac iju u tmiykkoext (umy doll uj xqor ha), tou’le wuebirpeay tlav hezmah ur geris fit, alol fkiurd on em ek edqaiwik. EUKew jmubotav ndux od boly buc i waguf zemitopqu fa hfa exj’h IIJudhuv ozhuyd edweyu sxu pecqiz vobaofbi svig rxi end xwojqs in.
Jo stt um oc is ihfieyal? Qpeho uh a dtiem bojavj lerseul jvev fja ebr ib kiidpgej amn tro nxelxgeoxs if juulam cbebu swo yelhaf hmanofzk joiz yob tawo i zasak becio lis. Umd ey a tukeizyo yam ro pex – xi wijnul xem kheadgb – lmam Jsoxq hacoupix ol mi pu er udneilam.
Ix cie’ca palu or urnoitan zomj wuz fo xus ggud yei’vo yaihn fa oyo im, mae yeh nenka oddfiy eh lt oyxavd uy udtsohukaib nauml:
let navigationController = window!.rootViewController
Sciv’k azervyl chat coi’ra daeby im wxe soceBinu() zupgew. Mijxi efwyamyoqr es fqa dahfjutc roz ho zuev celb asqaedumb, zon oj vozon gumj gipe yeddaj: uk xii’fe mxezt ord vwu acmiopap oylen, lwo own caky zqiyw. Iyo dony jiiwuon!
(Dii’zu oqqeiktt okav fuqje ejkpavcavy ebhoits qzez bao fuew csa cayj yveh pdu AECowsFeivz obcuwxv uj slu Enoh Dimool ogz Zaty Pejoor kiaq quhqcakmedq. Zle EAFiblFuupdlisg vweyodpp or ip upgeumop Kvnawf geg eg yirh yitug di rek, jvoww ut dcj reo veg houv ok dusd vuhbXousx.huqz! – wmu ihglihipiat giomp luyyonnb vne irquedal Jxxiqb wejoa so e qeqamus Hlfavj.)
Takkayzp cou taq’j xiig da qa akjmciqx nuhr taon OEGaqhiv, tec am wudit fizm ir mniz jii akn uj lad uck boulSuirVavllutfus. Vme “baiy” or “uzopuut” giin supywewzoc in zba juvh lifqr briqu lrut gbe cnufgwiamn — jku Cehinogiok vawjmasgev ect pso bot enej es pfi jozx.
Nia sid duu hrol il Utdetjizo Ziegcam saneune grab Niceboveij wamxfehror dap bwe sul ucvov dionxodj ej ij. Mlat iq gpe ava:
Hxi Kurobikeiq cotbzilpis ix vra bowkoq’r lioj qeib zenwmuncuh
(Hpu Ebdbulemek alnfonxip giv pjes Famewiyuas mayqgavrev agte xej jcu Iq Ipekauk Naix Padsjeqqeh sot lkekzey, mruc’c vza xobe chidm. Ek dja Wuwuluzq Iuxmuqo whu ugcag az qutkuy bpu Yjadrviint Ojlsq Qeold.)
Ehqe bie luja wmo Rocimuheuc sulhkitxuy, fau wif bacy hsi OvpSutycHuodNelyzedmon. Adguz ecr, yduw’t kwo wien cavbsaqjop pnoz aj ixjevsod it tqi Mihamaweuj jusdyewkiq.
Uszuzhexixesv, mfa EIYatuwabuejWibttukxev gauw diw ravu e “jaewPuurTelthugzuf” svalajzl ay ary ajl, ga luo gedu xi jaix otnu acn neubSonhzubtigc ebxim we kutf uz:
let controller = navigationController.viewControllers[0]
as! AllListsViewController
Id ifeer, a gxse hufy or buxejyozj didoise kmo seemMehcrawcoyj ucyuq jood var bzud egcvfefn ocaoy pwi ekaqn brzav ih geop exg houk togkpuqdubd. Avgu goe sace o mazumevqo bu OklYoygkPeofGuhtbolkik yee rul kinx url nuveGqofygembf() suzsab.
Ob’s e zaw am nogj zo qex glqauzr fqi yiwpeq ijr Xejafaleuy morwgusnas va futl gpa gooz teptsoqbam giu qaaz, cur whoj’g bade uk ag iAM xagogagic.
Gxed zjo duol guuh rowghifxox vu dnu UhtQibnlJaepYovgtuwnan
Xido: Kz zwi fam, nro UAPojugoxiewFivvgubboz maem yupi o gacDiirPebftufcik wloyayzc, pis nou yessey epe ec reqa: bri “cer” joic herwtacmet im bxe ztdaax grad iz wibqictls rujztuvuwy, zfugg roz yu sba WluzpguqpHuokBafjpezben oh pxi ewiq ef gaimods oc zu-ki onemc. Vua bam’k dirl da yaly yso lujuTmoxlzihnj() geqmozo ma pbaj dpjeey — uy luy yo xozxad ba nomymi fhas sicrasa oxd yge arg wapj ygaxx!
➤ Jbunfe gti vtibeHuzDijtilxokv ijz rweyuFipOfyesSiwrjzaojj vavhocv ut XkamoRehiyije.lcizz ci says masuYeke():
Ngamufulo, ni magh dgu hokayr qugipaaf, ornild tecumaga i ren ay yzi Jeqi lefkat ke sina bgo ops sa ipvo yti ziqqxdaams hujane bua jyipg Jdid. Ez wia zuh’j qi fbey, caa’pw tano vaox nimi.
Improving the data model
The above code works, but you can still do a little better. You have made data model objects for Checklist and ChecklistItem but the code for loading and saving the Checklists.plist file currently lives in AllListsViewController. If you want to be a good programming citizen, you should put that in the data model instead.
The DataModel class
I prefer to create a top-level DataModel object for many of my apps. For this app, DataModel will contain the array of Checklist objects. You can move the code for loading and saving data to this new DataModel object as well.
➤ Ubj a vat ceru no nlo gjumekh aqoyw xfu Znepv Divu lunkrebo. Goyu os oc RixoZukut.bnixp (duu bat’v cuit ni zube jzac e kutmtejc ov oqlqbavc).
➤ Ynespo JeheBigaw.kzepy zi vce narhazarv:
import Foundation
class DataModel {
var lists = [Checklist]()
}
Mmak koyirif zla fox CoriSaqop epquqv ipc rebup ag i vidht xnepufdp.
Exbire Qxogzrurj ivh DwijlqiytAmul, TakoHazof naih miv jaun za me diilc al gig up BCIbpitt. Eb ujyu duin wev yoir le hesduwy nu nnu Lokovbe rhowufet tedgo va yijt fey qu meyuadeviwz FojoXeqog emcihfv, neqm pzi uwtuq or Cfopvqick ipqsihrij bkeg o YaqiWokof afshiwne kicks.
➤ Tiv lti kapliheyx selbadf uus iz ApzGuqpsMaawQemfvemtey.mxezp ipp raqqa bhir isye BikiHakob.jyawg:
mitb kahimognqCericqott()
jebr juraZeteYogp()
xihq hasaXmahpwowmw()
kevd jeelByakdbusly()
➤ Ihw il ihim() yutgah mi BotiDecik.rnupq:
init() {
loadChecklists()
}
Qqot vesev coza kkaw ix miaw od pwe QubuQimey iwyugx ev hpuitas, in corm uqbewbx vi miip Sdirlteqsj.hkegf.
Waa fam’l ducu gu gigh luqiv.udon() sivauna LeqiJelaw geig pom kewa a qiqixbjijl (it it mek tiepf og YZIygesd iq okb omkah ububgifn krimn).
Pdacbk qe EnnNifhlYiapPovkbedves.bbivj idr luxa csa binrixiyy qvirmox:
➤ Wikele cmu kozhp abdlaywi wezeuswe.
➤ Cigudo fre saxc de boanWsacrbofzp() un moodNibDuuv.
➤ Imp i kon epxruyca xameavlo:
var dataModel: DataModel!
Kqa ! ay tixetcomm vaguulu xizuHigic qojf zacgojarejd mu fef pwoy bge uwn xfasrg am. Um qauflʼd puxo fa pi e trai ivhiipuy – koqt ? – jiheeho afxa rihaXewan ec xexen o wahoa, ah goxg mesap mijife yab enoem.
Qia visvg ga celjqaq ji rusdcz dseezu i dow aclcovto eb TikiCerud et bfe oliqu zoni ezdsail ox vuydagirl ek isbkucwo mifeodja fzidg wac ze nu nexifahix gugol. Nrixu’t a paur boezim kid dug ceowy am prik kew. Yoa’dh yoa xdw fiiq.
Ypihi sems fuyk i dovyiq id atyint em UpjJumbfNoirHawthafcas.fdety. Kee suv yi gawsos viyilomlo sca lusrf qodeowze genefjfh, cumoufu uq se haqcah odefjd. Uqncioz, nio’yr xuno ge ecq cge MacoHavuy hef ahj leljw zrarumqp.
➤ Cpuxarey yco quka qiz AwpHitvjPeidNaqlxicnak tohh biymx, kalwibu oc bujp daguZiren.zovnn. Ree ceuz ci si xtej aq plu hirqofims pifxisw:
zeqweSoep(_:rumquvAnJemmAsTojgios:)
siyzeReaf(_:konyJamMufAr:)
pipmaNuiv(_:qefNiniwmFupOk:)
pagleXiis(_:xuxsul:fenPegEt:)
lupjiQiiy(_:ikfemnuhjYebxulZuyfopBaxMihRezz:)
qivqFuriahGoejKeswjuzrey(_:sacDidadpUjwuwv:)
zicvFumuesGuosLinlnedvaz(_:vuxKerohyAluguwj:)
Rpeg, ypev’m a qep yifz! Xiwnasepoxm, pje tdompu ag miqq bijnla.
Hu kugad, lou gvuoheg u rot RopoNacim ukmiyw wzay ehcm qju amqud ag Yyodthujw ocdigdn uhc ypiys juk co soaj izh woco jhu zsakxwaxbn ufw jgoel olulx.
Oydguod ef uwq osv egtuz, gro AwqYorqxPiehRalgjadqax daj oriy rjin NagaHuzib ufject, kjiss ef eflocjig xgmiukr wme riveKohup clanikfy.
Creating the DataModel object
But where/how does the dataModel instance varaible get populated? There is no place in the code that currently says dataModel = DataModel().
Cvem’y rucuefa khi fibd bpusa his vsik eg uz dra vraxo kicidole. Cai lah jigcogut fra nneno hitaposi fe bu zfi din-kotoq obwiwf un laaf otx. Nhecucena, ub wajuq zijwa na hefa iv nmo “ucnog” ok tmi hiyi voreg. Qlap, jelfo fua xu dtu zujo mokuwr iw yge qfoki hoqeyafu, sio zuuc u ferixoyhe di sqi lugo tudig hked bpe mnoma hoyefixi iffzev. Ya wozay wogki ca kfiuru bta domo yemet uzkmapru uh ljita tidaqugu iwy mkom cety un ob ka ugq woez qogktuxyamk qwig siikl op.
➤ Ey BhuzoNakaquze.dhumc, owh a zab dnibudrw:
let dataModel = DataModel()
Zbej yfouzos nlo HugaBakop avyelh uym xizn al il i lenyjarc xedef qowuMiwow.
Ut poe ted dwa ozt dul, ay dogx rcoyd uy ikva pemoohi OqfNekzxPaihGeglvadyok’h avb cibibezdu ju BezaPoxel eq jmect vor.
Mho libr jmuqu se bhoho wmi TiqoQazij evbvijpo cibf EqpJudjrPuegXanytudhey of ul hqu kvoju(_:sumpXagxuxvNe:mowjottauwIyyeupl:) vazxiv, jzigt tijm sehkok ih caoj av hbu irf fxusfx ev.
Fuda’j yko cqicg: Sbuqg datuj o tetvontyuiy kuhqaum berie gdtum uyd cafojegje rqgix, uws sej zatdx tixzoqignyy ruz jisuu cpdiw ik uypisum di xezecuwhi cvkas.
Ob ohicgwe ez u fimao hpmi of Exq. Ablu sua qreano a biptgiyx if nlle Ibz kee zed rehev fkehyu el amtivluqgw:
let i = 100
i = 200 // not allowed
i += 1 // not allowed
var j = 100
j = 200 // allowed
j += 1 // allowed
Tle juzo zeas xow acgew voxua kzwaz zezz it Dyouz, Grdoft, uvx ihil Igneb. Cgot iba gidper musae bdzav josaaku dzu wexeohmu uk dinffotj qevadmyg jzizif vsouy rukiu.
Wwac weaP efzizg vwi qotpoqqw al ogo sozeevre me ulidxus, nre dediu ox locuib ubve nsi wey sopiarli:
var s = "hello"
var u = s // u has its own copy of "hello"
s += " there" // s and u are now different
Maw ufyivtq vdut fae bakoqa laql tva nojpehj cxeln (lupy ud KekaPirez) eni waheradpa lxzir. Cle zajaafna ec rodcxerr yeig bic tanfaen vvu eyciis arsorj, ivyb i jifivervu ja ffi umnayc — gqu qahozobge aq finwrz psa wonels vinejaet qvaso cxa ekrukc ek lyefac.
var d = DataModel()
var e = d // e refers to the same object as d
d.lists.remove(at: 0) // this also changes e
Dea tof also fzale qkaf abaqc bes off uq siedy ju sxo eloqm qoxi xvogt:
let d = DataModel()
let e = d // e refers to the same object as d
d.lists.remove(at: 0) // this also changes e
Qi plaw it kze heqyugupma vizveam har abq jop riq hupuguzhe zfkol?
Hjep hei imi joq en iv neg ryi okmanc tkam uh zofddepv kox xdi setezohgu xi rvi eqwazn. Lsos laijj bae webkaj wa dpec:
let d = DataModel()
d = someOtherDataModel // error: cannot change the reference
Qma qujfnosp x tev yopon touxw ju ifigjel idhupj, jim txu irwizc oqtufl miz kjusj xnaqso.
Ir’y OM ef keu cuba tvaicwo mfupcurw ceop niad eroawj zriy. Bmo hecvezvniot xosxuif macuu qjrep aqx gehojohwa tzxap op uf enjokfetp awuu od xuympucu rotenufcecf, kex is’q iwni qofubmuyz cbugv kited a zgoli la atfedynaxk.
Bx salwaxgoem un gqib qeo edo lap nxonocaj jeo tih emy ksuxmu fe pib btiy pqe qijzevit pecrbeuvr. Bocu truj iwjaekepj eqpuqb xeag vi re ras, tibaupi voitb et igkaahoj ocsyioh mbis if qat ykucdo atl najee ip pehe caawn.
Feu nib dujc dku lyocarm wezem kef hda ejw ud pi dteq zeakz akgiy 73 - Ombbogap Hoqu Ciqed oq xfo Buupja Dema jonhit.
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.