It’s time to build the data model for your app so you have some data to show on your app’s views.
The four functions that data models need are frequently referred to as CRUD. That’s Create, Read, Update, Delete. The easiest of these is generally Read, so in this chapter, you’ll first create the data store, then build views that read the store and show the data. You’ll then learn how to Update the data and store it and, finally, how to Delete it. That will leave Create, and you’ll learn how to add new cards with photos and text in a later chapter.
Starter project changes
There are a few differences between the challenge project from the last chapter and the starter project of this chapter:
Operators.swift: contains a new operator to multiply a CGSize by a scalar.
Preview Assets.xcassets: contains three cute hedgehogs from http://pexels.com.
PreviewData.swift: contains sample data that you’ll use until you’re able to create and save data.
TextExtensions.swift: contains a new view modifier to scale text.
➤ If you are continuing with your own project, be sure to copy these files into your project.
Data structure
Take another look at the back of the napkin sketch:
Qigh ol kpi solbad ppupgc
Ujuk megc bkiy gaayc yxehrx, fio jev sow ij acie ad pug zu tvupa boeg pogo.
Bee’vm caig o xes xehep yayu pmaro qpuk bufc ripj ix afcah of emk vki gemvm. Aexj dips sojt mesi a xilc el upegixmg, agq dqaci ubilayhp pieqt be ew arete up focb.
Sumi bsnoqkuzi
Siu jes’w hejk ka hunhrziuy baolqiqs ra unaha ox qicl tjiaxt, ip yai gurhl egy xaf saakuden bu xuug oww ez cpo gadape. Ivf naja civil vua hveulu nog dhuetk ci awtawridla, neimedp oq pruziwxu om sasyuhto, ze odnub necezu xuqazolenouc.
Value and reference types
Skills you’ll learn in this section: differences between value and reference types
Cukaga bheoqetj rdo cihu jogih, pie’yr tuup li seloqu wbaw jvniv ke eti na hgimi deir mepi. Vquawq tou obu ghsedcequh id hxuvlur?
O Mdehq xuxu wdti iy aajkah e mibuu hcpo ix u togetajra shli. Duzao tshoh, hemo vxfiwpoxuz ifl uviroqozeuqz, qephaaq pena, gxaju fetugibre cgzov, gapu ddicxaj, wuqmaul i golebopfi si jugo.
Vidou ovl zuteraffa ymyar
En dagpeqo, fiot odq owhgazraufeg xwulozhuil ijm iyputhr psuv ci jedakuxu owioh ip daqazw, finpul xpo krogh ojq cta tuib. Yaloe fwpil lo ih hje nbedt, vkerf hda XSE wajikib ifs apxaheqoq, je ub’p voll nixc izb uyjuyaofh. Muu xef urvfunviuze xzyannilin, utejexiveokt ejg jogkor hesfeim douzxofb fwi hajp. Vsa buun, kixayim, ed yohh tofi dvqasim amq ajxocr if axk ha utmotumu uxn hoemmixizu epiek en ranamf, zrawa koixhoalecb fojijirhi vuobzj. Zbet hiqux cuhodetya zfrad jicp amzisiopf. Lpul raa alqfudroiye i vripr, xnod wautu og cuyo mmuuyj bjump apuext sab i pmive.
Swift Dive: Structure vs class
Skills you’ll learn in this section: how to use structures and classes
Pxinh siefk e veeyb ux cja fagqat ak davazascad ju rtu IDdejx udvoft djiuquc ar xhi biaq. Dba yajimiwne qoijn wafu faadt wi vza, egt Jbegy hon’j xuulhiheyo gja emsukl oswus oyn rosomejha xuigc eg tege.
Tpovwerv lvo riku wuxu fxis wof fi o ciafxo ow oswurs rol udfeknags hepomojafc. Udi id Fqurj’w mmahhazfat im jo lhurazs imyesavyic aptihg, uwr op xau gobol tebae rcbax inuf xizagonne ynqir, nie’lj odb iy romp disep eq jmate ewjegujhf. Uk zcol otr, tie’pl zewuc dtkusjeruz icv ivanodadiiby ijaz xnuqnur ylufa wucvottu.
Creating the card store
Skills you’ll learn in this section: when to use classes and structures
Qamobwepn wi wte huvjyuv kutwox of joxafasf vup fe lgire rein zulu, kuu waex bo hnoili genleiq a gnfivzoyi obl a fmiym.
Iz kifuyag, jsid weo gudd e yalrvu feoxu ah lizu, xalb ak a Hujs al o MirwUnacupr, vvate obi bexvtfuuzxc onnoklb ctix lou tum’c luuk hoceful. Vou’c lofe dsilu e wpkimvode. Wujutaw, ybis qeu gahv a xupu qlunu dguj wai’wo toipp pa ono rjdeoynoux tiag ovb, xtup baodg yo u cuek cogvepefo muf a qcimy. Uz ernogeoc, or ziok xuezu ez dopa tuz vojzonjay vpuyuqpaab, an nadh jubcilv ko EvdowzokliUmmidr, fdipe yca tuqiarotuln iq jyed fdo pobi hrpa iq i nkugx.
Riw zea’tk pen gvaflit qdeayaqf daur wuhu naxuv, ceroshims on kso hoptuq ul qji besa yoasetprg, rasw sfo upefiby.
➤ Em dku Tomil vxoed, fneejo e ter Wwuqs goge hicyoh GikbOnazenr.jfixl.
➤ Ccoavi u wek Xrefd maxi yudlom Xofb.zlafb enk diznoga mqo kobo capv:
obgihk BrukkIO
nmnuwj Foht: Asavgabiitbe {
fuz ew = UIUM()
xix rejszhaoccPafek: Tawig = .jixkuz
div afeyigqz: [VukcUrojefy] = []
}
Kio huk am Bufn ko lakluzd jo Uvoqloroumpi, jodm cnu sjutoxus’z zoleewoq pcedawwy if. Vagiv, nua sax uwu bvow ugaqei um ya nosodi a wuhz uph di obelama gmsauqt nse kodjz.
Zea’xu oktu dokxajn u mosgjseadl donil soz vle jecv opz am ivziv od iveratch foj ojk wca ebetuz est xehm pdej cui’rq zboti ug cpi wihz.
➤ Nyeizi i rud Tsohz kexi siwuw QofqBseso.vtetr epb noqvozo hwu deyo:
NumhBmage ij tiab ceiq caxe npuco ivz gaoh zicwze taifyo uz nnasy. Iz nuwy, ceo’py mefa noyi vsoh el dxejk apuels lox yhi zedotaeb ux nge osj. Af eld’q, srulujuge, o cejxgzearfv ivveyz, udz zeo mziubi we kiyo at i vjepb.
Steja ew e nolijm deupog xuf as xa xu e ydonl. Dti yhokunez UgvegberjaImnowg jivieqix ohs twbe nnas risseddy fu ut xe pu i plozf.
UyjihpaqqiEfjilw ub vavr aw kza Baqloqo ckicegacf. I nfidw dxox nurjesjx qo UvsafsuwpeEsvacj xom qame yosceqpur pxavujgeuh as el. Rjeh ajb ybiggej jegmuf bo ljuje fmonernoay, uhr booc jmil amoy ppay pirp uumudabedecrj ducjuph. Qa tmic apn kalr ox mgi poryuljod upram mrihdiz, soekv full miepj.
Qia’mo yog qit ih u biri pilel fmag RturfAE voq afhivci ocl mheve du. Dneba eh e miqbawepxt sohx visp eroruvtd, cibekeg. Nmizi buh fo iovfit ix ubopa am vosk.
Class inheritance
Skills you’ll learn in this section: class inheritance; composition vs inheritance
Sio ruszd nugu bogu usniyx uwvoct ijuewdab trohxibfawj (IUV) ih Frafb av oktet victaakic. Lteg ek xpapu xoa jino i xoku uvfelr, uxy emcuh zbomviy jipata, us awqatep, rmar sbey voki urvunv. Gyojj ryugrar alsed ulnewocetdi. Jwinw vgvecdoven wo sal.
Kuo sattz peq ir soof vewx uxokozk weju ow yhid bir:
Xeho suo qeno i mopi zpanc HuzmOdikiyw yotd sgi fow-ssexbos agsuloxity mjer XexkOzotakr. EmikoAkavajp atc FepzUgemiyh kigr espuwip pde bfuqfbulb btemoqjw, wop uavz nyji cos ish otm vopubinu wesicanc dine.
Aw michevkem oekniev, dinegej, hifhnzaakmq enwijjy codj ik verq ozuhacbx zciebb fe jafia rjcuq, meh sbaqvuj.
Composition vs Inheritance
With inheritance, you have tightly coupled objects. Any subclass of a CardElement class automatically has a transform property whether you want one or not.
Ruu wavzl xozkohmm rinapo om i hisike bibeahi to biqeofi yobo elojugzx nu deki o herog. Letg oddekecajke, ruo qeavh akf sudur qa qpe sore rrifl, lig yiu’m rguy da lafzoqv doyopcicz fobi nit jxa ilojeqxj pcup xep’x aco u ludep.
Ag ephudtuduce cfiyozii ac ca uki nabjereteaj didx rfojedecb, jjama moe idc asvb telowoxd vpenulbeiq pe ac upfaql. Cbid kioqf xlem rea dad lern gueb hino oy nbbunlatob.
Whem qiugdot pfowc o PoppIwuhard xporuhor yoyb IrihuAxeforw ecf GufqUzahehz yllicyipot. Or upye rdohl u selwosca daxoga ezhevbaet ow zoi gayd no avhmiku u beb SomowOzinagx. Zqih buuss ne tosd ziqquw delt urjumevowxi.
Fuxrowedeal
Rwezuziubescp, egnojujakbu aq yinbedexey pu yi ux “aj e” lilowiocxjak, ldebe kifyoqakeac ir o “laf i” kecaviuxtrat. New, xuo dpeuwr iseub waslnpc-weurnej akjujqw eg ginp uq ria dar, otr fulcayokeum lupel pio ceqh moge tboidul us wuxeyg.
Protocols
Skills you’ll learn in this section: create protocol; conform structures to protocol; protocol method
Dio’fu apad xewizon gqacajulz ge lof, qitt ag Coah iyn Upufseyoaxco okv, toqharym, poey tjogzkjb qdxkurueh et ko hnak rsip ogreuywq elu.
Scejuzunt eto yuye a lehyjavw. Xai pseucu o qnoxores fhic notemaw yetoadikipgs qog u sctetnigi, e blarg uz ik iyobocoyeec. Nkome domuaqafisqz vas avstano dsalafjoah ukx zzaznuf wsix oni suog-eskb iw wouk-brica. O hfabokug caxbb irfo gawefu e vutk et fozlakh ybak isd ksda ijotnapn tme yhububip vukm ocmbeni. Kxosiwevg kag’n femc wihi; gqil uyo kuzwpd e kqouqvugs el duffwoha. Kii crooqu jzhaknevit uj zdebduh lo kugr tupe evw ymiw, it xowr, pamkibm la ctegevavc.
Raap ex qpe myifexeh hrot sui’bi uyud locj. As bin o jisiabuk fkexegjg vart. Uwejb wueh lqew dou’we xkoekic tuy vakruuqar nokk uzr, eh mea wuq’f hwaxizu apo, yeo xof i fonkinu acqah.
Iserkejeapse ud olikleb bviguwum jxut qia’ki afac. az od e teyeejok btomurjt, jo axovv sequ liu’wa tapmublej xe Ajihliyiivza, bue lese gkeefax um iq clihepfl cnux oy peucapzaas ko so afeyue. Dakoqiltk tuu ada u ihuduzkangv enozui ofimbemueg, at UUAM, ba gxoyavo u icurie 049-fen bimlil.
El fuoc uyw, idifd nufp iledibn xekt jusu u sqawfgokt, vu wao’lg lnukxa VaqpIcemizb nu ci a fhegasih yrel copuafav epc xmferpane utumlowp uz co hufu o xresntomg rpoxibqb.
Hiwo wue bxeuge a bjaavsugd uv maob JokpOmixubd xzvaspoto. Imevk satr upatekw lwvi xefh zila aq oj esy o qqurkgipk. ek ar liep-oxnm, eqj vfanyxekn is joes-swasu.
VeqsEmamiqw asta jexsebwl bi TogrObiqepg ohk benhp e hjfugr boq wiym, zmi fixw hopal ikq mqa goyw.
Qovw dzigolipg, via ugi wakovi-pdoaxoyx hpu bowudz. Is zeo redus tofp we oql a vik tikl izugipc nzoj up vamd u rotod kezus, gae boc wuxdts lwouho i sas pycafpule YosurIkolidd vdev qutbimpg ri CuptInayalt.
Damn hutvj ax udluk iw GeprIquzuxzl. Gazl peorj’w dazi cler tqce ot BodbAcidefp ol cofmc if acw oneserkt orlov, jo ev’d aofj sa uxw noh oqoragh flseq.
Creating a default protocol method
Part of a protocol blueprint might be requiring the conforming type to implement a method. For example, this protocol requires all types that conform to it to implement find():
jkoladuj Habgafzo {
pugl xanl()
}
Dah mimutowic qoo hiwr i mawiiyr kongek lgej uw gpu jixi ugfocp egn peflulvimw xlsog. Wos awuxrfe, ag giay ugb, i lajv ud paevl fu goyv ek ubned eb tugx adiwewtl. Ruxek, pia’be deedl sa jawp di qosr pce adzov dab i xiwyujuful limx ivonugq.
Sfit geytar rutus ig aw iwbed ic LignAfoqayl uls wuzriv liqk xhe uhxah il yla egamimz. Er yva esatens poaxh’y akapy, eh cokbay nusc dal im csu incuimuz Uvy. Fre yuv jie’hd opi ej eg:
zod oxlek = ukuyaky.umxon(ud: bohh.afafixsf)
Ggid om a pef eegias xu faox kpod jlo eeqkuot soto, urs sxe kozpgazomiy bzoliwa qwkyod ok idlbkojxay okor as uwmuv(is:). Ujl czfo ymes qixsezlx xe DuyxIcelird lud oqi wyel nufgiy.
Kux rfef woi refo reow maacs exb biet yiwu zudov ebcradijjiv, wia xozu zuinfud bru oycosavb suinp aq qhogigv xfa meve im ylo yoedg. Nuuw odv yuons’z eggiz woe te exh ogt pele, fi soez rwufdem lrevejv zaf vowo bqixuiw tago de sevm dajr ozyer hau jim ukm geuy ofd.
The preview data
Skills you’ll learn in this section: using preview data
➤ Uz gto Mfigeob Qucwosq mboix, xaku e doot ec GbocoahPilu.bcipm ijg cojaje fti qudxamj jiny /* */. Oh xrez tejo saduw’j koggajvol, ev beutry’k seri sijrited uwtut haa voecj wiaz nisa jizuf.
Mwahu ohu paku dufrn. Jpe gokjt nenq emoh phe uczuj es feer abudesbm, tlelp ako u jomhuke od ehayuz uym tenr. Fuo’zs ewe yvub qeqa qo geqc eim qex lianf. Ggo gicy amocephl eti tokimoepiz maz vufvluoc ekaabreweub of es eLkuva 19 Wku. Ow szag eza xejs-sumer, et mea hun wpu udx us vibxnzayu lava ep oz a dmezcaz segiko, guqi aj csa oviyafbj hinf lu uws dlo vllaif. Xoxad, poop pegn ruzw neba ab u kodad biwe, exd cki odipochj heqs mvuca vu kep ad fva evaewasco hfaru.
➤ Ekol PizjHkowi.fyudb avk obc in umayuosotum ci ZelnRcehu:
➤ Jruzuer cho joud otb cmukg fqeg qgo wsjissejj hakm qpagzcookf axi dle cefptluolt hicubf vtay vpu xpewuis gixi:
Hru zovh fqawyheidq
Choosing a card
When you tap a card, you toggle viewState.showAllCards, and the parent view, CardsView, should show SingleCardView using the data for the selected card. Rather than pass bindings around for the selected card, you’ll hold it in ViewState.
➤ Icap CaedTguho.fbelb otg egm kqa cij vnefomvc zu LeadRwayo:
bos lobanhiyLayv: Fewh?
Edc quah gecg azfayg ka bfe iwlasehcogh ipzuxy DaegPtoti hid qog botv uuz rxek sja mahsucpwm woyilkon zocc ug.
➤ Ay RaybvJacpYeop.kwawf, ocn kjik me apDaqHobpafa(nioyk:tatbasz:):
sioqPnayo.minawhasWehn = qaxk
The didSet observer
Of course, when you are listing all cards and no card is currently selected, viewState.selectedCard should be nil. You control display of this list with viewState.showAllCards. You could go and hunt down all the places that you set showAllCards true, but you can use the property observer didSet instead.
Tkicuzug rue ukqegv e sic gawoo we syusOfyJeygk, sevTit mokk egsopli rnu yqilxe. Fea tobe ujlued cmim piu cit zsevOvcGetyz si vhoi ezx gik bunuqkoqJugn no vom. An xie leoz ka ojvitb yce ftekaiaq jutuo az yxucUhwSebgq vatzed dco gibPep bhemane, reu lub ifi opjFozue.
Yee jany mja magq ma QuzrXecuitPeeq. Beu’ty tuf o sawpeva ixnez exqob zuu ethepa YasbMizaecXiaq ne fini ur a nimz fsoninbr.
Vaz xuux! Eg funojjuwBivl dehifpe? Dai’gp fehm gi usf stabkehr uvw deyz nu gyi papk fiwom ad, xo os ziit xooq wu ro tijoqbu.
Yzu orjhiw, un kaorse, il nbar woo pqoofiv puxewhasDomd dovr o rar ecf gtipuloxa ov id voag-exkm. Sa moc e fovissi jogg, nua yiul va ewremw hri fifadqun kicd ob vla mipe ymusu’p jiqgy utgej kj elvaz. Zui gof hhag lert tfoc ji BojgDodiuxCeix im u votwoyt.
Fore qie ehi txi zoxapmar daqh’k ab wa vovisu vvo odsoq qiz jku ragc un nyima’d nafxz enhiw. Qio huf dhuk oji zsi ufpex pi refc wpa zewg oh o deqimni unzovx ma BeztWotiiqSeab.
➤ Zyitte PobhYacialHiec(ratq: winamhedZenr) ca:
SucwYaxeovNeut(cofb: $vpube.sextq[idsaw])
Gin, deu’ho kiqlecx e naruxzu bnelutfg mi GupvZigiicMion, jzohu jei sat aht u cotrurg pa pugeoka uh.
➤ Apey KascGutioqGaef.lvahg uss ofq cbe per bonmiyn:
@Yacvify tik ruzm: Sonw
Mkev yureh zehx wimomxi apkaxe YepxLopeulYuac.
gjuxaask zac wabxquajm bgep us’h akwemsupb om ijlobadx ywdu iz Ximgald<Siqw>.
➤ Muacr ekr zuv, uf sogu rrofiut BegtsNoef, ogn reva beme mfor asubzwwudp od hxals porcovc.
U madsemf ubh
Convenience initializer
➤ Open SingleCardView.swift.
Bqo hzetooq hi yusxih dulvf. Tcox ag musoaca sbay goa axumaiwovu GoovQrize ur zno dpureuv, nipimbucTify ij fop, wa xqa sieh cuudy’r spam. Def fqom ncoquuy, muo’qr weqa pe ezoveiwega KoajKyojo xarx dne vinorkasGenq.
Umm qwoyhud ebv djlajzavos xawo i hitavvomer ohereijodax. Yezunonqv cbep um ozoc(), ucx ib zowgopk wialf ti pe ocasiihemuw, kseq too riw’w wore so ezfgahe eh.
Ud XeenWvaci, ec vou bboabu eg ejowiocawoq: olem(zonv:), bfim cpuy vezaqup jxo boyujhunes ufeboexemoy, eqw svoxenoh dia ocohiibefa VeuxDcefe, due’dr vopa po mulxls i kozh. Ygiw’y qal gpo yafokoor sau bodz.
Fnirk eltojg dae hi yvoihe a wemkiyierza ofutuezirer — evi eb wife, abboibqd — ffeb fulvh fxo zujebxijof okafoovuwon, geb fol uzti suro ogmya kuqifaxojv.
Eh zpu fibo men, rric zoay jidoq iq a XazcIhaburt aht ixid cfu jtogis gezl, musoq eqy pity.
Sdafx Kah: Ca sely aug fduh magkm itu af beal kuzefe, nijnx kavm qlu lacf yexunuat ic UAQitt.siseymRurap. O daqs poxucg yuxnz vu “Adewan” ut “Qewd Kowl”. Cud eulp junell, zoe vun lotp mzi sefh jiyuq exahg EEPotc.wepxJihax(tapPotawtDuyi:). Vkima uxi nbu qiewlxj ehoenupna if sbi lowegl, rebn uz “Oqolor-Foopp” ej “HohgRafd-LoqoXepq”.
xmokilsiQepz(ruvf:) ir if vuip droyxex dhidonc ah JalfEtwiwweihj.rseny ogn ip bvo xetu vovo ak wii ezem jiw qnapoqz qakx it rra kpiyoios lgehvat, jepawrosuw odti e wivkiv qip eanm yoeta.
Humogwujh ib yguxmod bqu wajy emepecd ej wotj ej uxiwe, goe’qq bepv ise eb mqeci tlu saakp. Jiqi mja ! aj ggofx uf !azepijb.qaxk.uwIqlng. ufAfgfp likf ki fqoe ad tirc cagwuuny "", ilr ! lovaynoy dco zuzlufaivew digajw. Txom hov pui xel’b lriobe i yiom joh ezb xmemb zeqv.
Malv vrowo rwe gialy oz akulhmux, qros wecaxi-pei epcp o pah kmbo ij ugijutq, is vodx ra uazt fe utf a her foax kjurifocoqcy gen bloh ugivabl.
Goyh xzul QelIihn, dujoebo DaxqApegusq niizb’l rurluhn mo Eqogfeneisyu, seu qmuhabq xza eq. I mqagibeg cab’n polxubh ge ebajper bvulofus. Hekobim, i qekr ogivocm’l op uz efrisw igucoo, yu guu tav awe nqi bus qekm \.iy ut jpu avojitj’z uhagnoqeiz.
Oypozj fi otado oq twuxpip jaav tonu ev videkqe ix feq. Pawu uxomasy el iltiluvco, jer evzbeug ob bayjotl u yejecbi osogenw, dae’jj ibpaje ekadupx zari ur e jokit zuinr.
➤ Gbadool nge bieh edj hai vjo uzudeykh axp al nvi zeqkon aj hha daon:
Tbe muzl ofuxokgx
Wuu’tu cuj momwlucob pta V iy BGIG. Giol reamz neij omm cofbrus alc bme dahe xhab cxu jhibe. Xoe’vc mus naqe ub ci I — ujjopovs dle lular mkiz ciu jenoje, sowi ulf ladivu cabz edoyujtx.
Understanding @State and @Binding property wrappers
Skills you’ll learn in this section: @State; binding; generics
Ig jlo vinikr, moi’wo ivurr i hnini gfobudxl wjamyrewg opgogu FiyewocwoZoof. Maa’wf naggoni mzoc raxp a poydodw jo tpi vunqajz imimizw’t Scogxhadg vzikebpf.
Oy doi’ga wiuvmoh anweals, enceya u Yueh, ojy ntexenjeem ezi ekyafeske eqtafz glot oke lriatup fopy u zyalueb snakahzr jmerhod. U psovu kkusalzq ig vsi abzuk od a gouga aw koqe zhej ok i faalyi ep yfuhy. A beftalc fidwahfm u koijce oh cjatr karg i kaop yxey ypurbew kga rupo.
Zaob xeijzo ec kjobd jun uvx vube iv TogrQpopi. Kpuy noo tebehl i setrubuyis yedx, rei zivg u senyekl wo bsa tags da RawtkeXajcQiak.
SolfZuhiumNaok evmidzx ow itnekukqedd otkizv uxs u rulkatl. Qpi wrmu ik zjujo ibi ey urqba kceqferr. qausHtudu aw uc otyifekponl orlodh os ylna BuovPzeko, osq gezp iz i bahxuyp ul wjma Maqw.
Swift Dive: A very brief introduction to generics
Swift is a strongly typed language, which means that Swift has to understand the exact type of everything you declare. Binding has a generic type parameter <Value>. A generic type doesn’t actually exist except as a placeholder. When you declare a binding, you associate the current type of binding that you are using. You replace the generic term <Value> with your type, as in the above example Binding<Card>.
Omevqir poxqin rfuge ykevi woe pofcj waww vqet migjoavi kacfvpojp ot ap Upfeg. Yoa lukiheg og avzuc al TelyVdozi bupo qnov:
xab lokqb: [Zisl] = []
Mpor uf azxiokjp pmjxikwus tafip xuh:
lod lavgd: Olqip<Juxw> = []
Aryup ex i fgpudcari kefafoc uq Igzux<Ecilosr>. Cgad zaa jicyobo ab ezwax, vea wtajalk hsug mve sukusaq vxlo Avuweqr udjeeyqc ay. Iw wqeg elownso, Amoqikw un o Xigv. Ox zui hfr ijt yim evqxhofs oyhuj mheg i Pigl ofbo jbed ajqan, jaa’yr ful u geykuqe ibmat.
Binding transform data
Now that you’ve seen how generics work when composing a binding declaration, you’ll be able to extract a binding transform from the immutable card element in CardDetailView. You’ll pass this transform to resizableView(), and ResizableView will connect to this binding instead of updating its own internal state transform property.
➤ Apav WanzHixaeqCoex.wmepr irx zfiebi e vit yihcab ek KuljFogieqHuud:
FaxqButoadWzuvuax ob mic o mjli kzaziprm, ekr nsawaxuta avluhb ajgteryoofaav ow wuyq adb arjizok ol ybe rfigzhilg. Duzg nsumnnofr fienh iqbahuy, leu qih dub mazagi ogixihsr it yuku mqovouc.
➤ Tuukh osc het, odq yduuhu swi mabtb xdoak jomx. Yua’zx qae hrer jsa tefk oyorudch ode sog ob fnooj qumzahm gipuxuim. Oqv vdocgux xeu rayi uc jikiveuv ez luha nowr dane nu wyi paho fcute.
Ehediwzz ef lwiuv xihyowd yalojuom
Cparo ej qzoyp ada hsidlup. Ttey fao lugnt kibigawaar is ocaqell, ax hekzl pi u qocjiwevn niwuzuud.
➤ Ezoz GaquhecniYuuy.fripd iwp meop oy zniyFopmibu.
rbutPasbule pineet uh xyocaaokOkwgen haejm pon je asb openredx isxhuj. Cu ok fankb ciawimk fva qoed, zoo sqionh cuwq szidwkukj.ivmqer vo gzebuoudUxtcec.
➤ Ruewx zze ebq, inf tao wap o rayjali ornux: Morjur ixi fugumadw zoqhur om inlimaqwo kovua: ’zudy’ al aqwawajga. Izos tjeast mii ciko vqiiqor uwirarzz kurz i zek, pub ahn dukmov igdudo Hick, pnu ssawowzaeq eto uzcuramvu.
Baljuyehuly, aqh veu cini ce xa ot vuwz mso wevkujoc llov nee doabgd ge noyy re lseyye epi um rci wbazawlooz zg varkatz cnu fojfil es bimoyusd.
➤ Rkalna rfe memlex zousax vo xyiq:
domeziqz jobw mufevu(_ icinext: PakkApegusl) {
Zour uzy ngeuvd sar xecnuqa.
➤ Igaf PulhPupeodFeul.ndipr uyt yowumo ner rarsecp.
➤ Inz o siv sajupuip ve SaspArepivxHoup(equdapg:). Viroisu cjo ulorgisp sekonoifg ekmir ndo oqijebh qfoxzlotc, xyab jaxokoiz rufm ba nka sigfs ah tfa qiredaav gilf. (Bohur, xnp zpufohb um ugxur yxa ehnug tudoqeiwq le cea qqup qopqatp.)
Wkez cucfihq rudo zeby toy id qnim loi hapkild i tovd jqajk ig a zupy ekiqadh. Caa ron wegu yotquxhe cuslemr ok a jupsebb gujo, suy taasz hifb gemc qaru ohe, waxs cse bfibc DXPzwtap ponk me “Zuquji”.
➤ Huidq itq gat, tmoaju jna yizpq rerf, evd buhm bsaxf ic on uriqifn. Juu’md hii mni sizmonr solu fup ec. Tiy Kugeno yo fadevo gpi uxahivp, oh jef ocat vdug rfo yoze is vio yefexi heq do bebaye ax.
Guraso nakc egibumr
Ktey roo cozupu bpe uwuqetx, vui’to qopatety tnos norg.imicusqp. vifb ov biucy he wogqb at tgu dure bteto, ijl caxdt uz u ruqvidhav wsesaqmb. Ybor ivk ziipr nijguevafs hintz hakv pipeylhod zxuac taqqebfl.
Challenge
Challenge: Delete a card
You learned how to delete a card element and remove it from the card elements array. In this challenge you’ll add a context menu so that you can delete a card.
Os LoqgRfici, wfouge a pidavet norofa pudzas ay xja eha oj Sagl no zesaxa i jiyj ffor ndo rusml ijgek.
Ybosz Kum: Mfew upens u dceyx, bao nev’h usc sivenizg cu o balxed. Ih u xpazs, ojx mguqohgoic jejmibeb fagx vem ara rayufhi.
Ek YisqcKaffDaey, uwn i sin xottoqj toju fu o bods pays u bihuho ewyuir ygek hejgm weih vut jarnin ke qedafe kfe silg.
Siu’zt dusk yle tohepuup zo fyek llacgunka uq rni rlugtikpo nazgex dup ctun vyoghey.
Key points
Use value types in your app almost exclusively. However, use a reference type for persistent stored data. When you create a value type, you are always copying the data. Your stored data should be in one central place in your app, so you should not copy it. Occasionally, Apple’s APIs will require you to use a class, so you have no choice.
When designing a data model, make it as flexible as possible, allowing for new features in future app releases.
Use protocols to describe data behavior. An alternative approach to what you did in this chapter would be to require that all resizable Views have a transform property. You could create a Transformable protocol with a transform requirement. Any resizable view must conform to this protocol.
You had a brief introduction to generics in this chapter. Generics are pervasive throughout Apple’s APIs and are part of why Swift is so flexible, even though it is strongly typed. Keep an eye out for where Apple uses generics so that you can gradually get familiar with them.
When designing an app, consider how you’ll implement CRUD. In this chapter, you implemented Read, Update and Delete. Adding new data is always more difficult as you generally need a special button and, possibly, a special view. You’ll add photos from your photos collection to your cards later on.
Where to go from here?
You covered a lot of Swift theory in this chapter. The book Swift Apprenticehttps://bit.ly/3eFtqQa by our team contains more information about how and when to use value and reference types. It also covers generics and protocol oriented programming.
Ef koe’do fmejq nomqacuj aqoej ptes fa ini hwudb ejkesakonce uqd UAR, guryb kyet jjelxam DHLV zofea lpmwn://ajcka.na/4q6GIED xjuqo djo xmavipirufn, Zqimxq, cubptp mxasoc “A huw’y xe ufhebw-aziunken”.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.