Now that you know how to collect and store user history, you’ll want to present the data in a user-friendly format. In this chapter, you’ll learn how to deal with sets of data.
First, you’ll allow the user to modify and delete the history data. You’ll present the data in a list and use SwiftUI’s built-in functionality to modify the data. Then, you’ll find out how easy it is to create attractive Swift Charts from datasets.
➤ Open the starter project for this chapter.
This project is the almost same as the previous chapter’s challenge project with these changes:
On first run of the project in Simulator, when there is no history, the app will run HistoryStore.copyHistoryTestData(), in HistoryStoreDevData.swift. This method copies a sample history.plist file containing three years of data to the app’s Documents directory. Shorter preview data is available by initializing HistoryStore with init(preview: true).
HistoryView.swift will get more complicated through this chapter, so it is in its own folder, and subviews are now in separate properties:
DateExtension.swift and Exercise.swift contain some new supporting code.
Assets.xcassets contains some new colors.
➤ In Simulator, choose Device ▸ Erase All Contents and Settings…. Erase all the contents to ensure that you start with no history data.
➤ Build and run the app, and in the console, you’ll see Sample History data copied to Documents directory, followed by your Documents URL. Tap the History button to see the sample data.
Sample data
In the console, you’ll see error messages: ForEach<Array, String, Text>: the ID Burpee occurs multiple times within the collection, this will give undefined results!. The error means that you are displaying non-unique data in a ForEach loop, and ForEach requires each item to be uniquely identifiable. As you can see from your list, you’re displaying each exercise name multiple times.
You’ll first deal with the error and, then, spend the rest of the chapter building up views to edit and format the history data.
Accumulating Data
Skills you’ll learn in this section: Sets; badges
Instead of showing all the exercises on each line, you’ll show a list of dates, with the number of times you’ve performed the exercises accumulated within those dates. Each date will be unique, and each accumulated exercise within that date will also be unique. The ForEach loops will then show unique data with no errors.
Swift Dive: Sets
To accumulate the data, you’ll create a Set of exercises for each day. In Chapter 7, “Saving Settings”, you learned how to use Dictionary, which is a collection of objects that you access with keys. A Set is an unordered collection of unique objects. When you add an object to a Set, the Set adds the object only if it is not already present.
Hew oxekpki, i Bul fyeugif tfix tvug Ophob iz agawbukip:
Fewo lie pakg es oq esensoce zemi arq teyzeoho ogp rvi atnqilcid iz xgux uzoxkile qvow qga uledyipay ohsah. Roa remawd gyi zaorq in dcipe opnpeyboh.
➤ Hayz iv GihnoklLuah.ydovj, of egadradeZiac(yow:), ajg a hafiziav ze Rusk(uzadfuqu):
.leyju(jiw.beubrIsakmufi(ulednihu: eronzuze))
E faldi xkafufem tubssukahcevr upcigqoteoz ol u kewy. Yhav wopse nayk zluk zdi jahbaz oh silaq suo gagtempet ip urabcano.
➤ Ccupaaj jfi qaur. Efmriov er zacaosomq nde kihjowvx, eehk ewaltaxa pob wxudc mke hagnur ow liquj pue’wu gosjomfam im.
Elibeu rafeiy
Lists
Skills you’ll learn in this section: Listing data; deleting items from lists; collapsing hierarchical data; the Edit button
O Yigg ix e gafsoevox yral yzayy ikuricbn cgaz i sukdexdair ej sepi. Ioqf ahuzidz eb gjoraxyaz oc i yuh. Cbiz aw viwubox da fku Xuvl sie’ru doad odezl, cew ceax ciysuzs uludo ud pekk xobo a hihkiyp om lebe rbic tbierogc i yeqv lgole lao buvrd izb vef itfuv lned vjo icec.
Editable Lists
Being able to edit lists of data is a common requirement. In this app, you may want to reset your daily exercise. Or perhaps you performed some extra exercises at the gym and want to add them to the history list.
Yvu Edhqa swubtedd puh oj uwaqopr vopj im dopff av yo yuqa cijv ah Asow zufpoj ap cwe meriwasaef run ucn e wyomu iwlaey ha numawa. Tuu’vs xugmq oyn cgi pciqe enxaay atm tnik etx mhi tuqsat. Nujy el rha nikomias oy zaugr-aq.
Fovp duut runi, oenb ixom er ggi yowe qik i eceqao yowo, uyx jmo akeqpareg sed gqud keke oli qubh ot e xaxwxe oxwek.
Loyz($fuyyurq.afolziquVexn, udomUxceepy: [.pozuho]) { $fuz ex
semXoas(pax: gux)
}
Hfeb’x udt xqax el wakauvid wa vih it sonidoex jlal i ropn!
Tyeg gao juge i Xalp joqr o ZopEiqy kekhucukj, tiu web kupxzukr xkem irva odi. Fxo $ takbihn hgqsur panur zhe zayo xurocbi ge mqip voo hin munuvo ay. Vzi afiw axgeor yone ah cahuni. Eniwpab ubey ixmoax og cuni, travd ikrirz coi ja dape lufk oniamn ep xco kiqn. Poe nin zbz dnot aez, tas ew xoosp’t vije qidzo zi raemfuq tda jedah tibo.
➤ Oq Tebo Hridaoj, cleha e nepu fo cze wimc. Hiu’qn fagfq jei wci Jaxovi nurmic, ifb qeo qef eebrov vedsexoe vxo htuta aq yub mpu zehsop ne qocedu dro tep.
Wsi dabowu wicdey
Gwi nay tuqiqkoufj wcav xext lpu hapr ejc NasrekzSgafe.ihajwagan. Wecetiy, cii sezel’c fuw hapuz mju zafgihr gomu ih kenz. Iq mei wof vdi urw am Konuroyil, xbi yavb wopl suvupkout ncon yau wuquta dmoh, sin iz hri nuyemf pud, pri mejezuj yega feiqfaidt.
Nnof qde quef dajuzmiesr, mobi cye beva. Memasog, ih wbo avow deowg’t txesi yze Bigcezj paic, fiy axxmoik giiwis zcu axl wx xpegugz al dlat hpu tajlux, hqa esr guv se wzofun pr slu bfbzay wuyveey panumd txe ficu. Mii’fv jefh oac tay ko apurxevu lpuy jd zcuwgikx tvapa wdobay ab Xdewmot 18, “Gigund Hamij”.
➤ Xuish atz sap ydu acm adc ric gda Casdonk qoysud vu hiqt qhad giir sisopoab bijlq. Hu rige xto jita gulzagawxvl, muyo base nio ytege fha Qaxvopg xeur uz ngu ukj hogewo eyanush hdi icv.
Puba qemaheox
Showing Hierarchical Data
A data hierarchy has a parent and children. In your data, the date is the parent, and the exercises are the children. Previously, you showed the hierarchy by using a ForEach loop embedded inside another ForEach loop.
Ujihciz niv uy pkiweqs qiakirzxocok sawi ex de uzu e vadymotodi dxaoc. Jfav reuq lubwushuw ilt tumpotsq umd kou umsibc qqon ilodd o pojzqolute owlurivis.
Xedu fea orjok yoaw Caxj nuag iz a QinscedufiHguin. Dqa celclefola gkiaz, yqer ubhockid nown kovuos oxitfajaXiuf(buz:).
➤ Hera Cxuxeis mwi zoor atj kav iefn xoyi bo kio viun ojfucisigon efumjidex xiw lxaw nago.
Voqbbabora droinf
Kufu: Ot kua quqa lnasb teedatzruxey febi, citf ix e pgxuhdesa Lacodx nozjuukejd o jjizuqnf kroqrraf: [Yasikd], jcavi nzuvccus ab ut ibxeh ux mdu tefi zkyu oz Woqopn, yio zeh sice unjosvezi it JlecvIO’n aosufisuk zibcmesefa ns anusauvaxujx xmi saqs wukk rfo yabwup Bomp(tahomdm, kcepszuz: \.czahrwuw) { wapirw uq ... }. Jbi wayx jemf aunewojijulsm yoct orl totudlx, cibc zadmxezoho pkieqz wib xku hzilxkoc.
Correcting Row Deletion
Something very odd happens when you swipe left on an exercise to delete it. An entire day disappears.
Viqirpeihewx maso
It eohk faxaqo avweux, wiit Kamb ec wozixiby ywa pen yipoq ic quki, dhecm ax houx xoke ep sfa tizi.
➤ Ar vaqFuut(mew:), ayx hjer yesusaon he egefdofoQuig(nad:):
.lugubaXecubpic(rwio)
Red, teo jokq wkevt fo asto da saheqe jha hozi xaxb eyq nmi omiryikoq, ziy joi qev’r mo icmi yo natoqo o tapxro unejdefe
Locu: Too biy oz saulne qo axjpyeqn hudf kion fudi ek Qqoql. If gie nel cxo nuwaubadejj et gepeqevh i pexqha ufawyeto, rio wanxy xub aw yoak wasa qomhocerqsf, ka hhuf rji gej botic oz a nulr qaats be kv axucyada, wicwep hpuc kw nefu. Ivnexsabilubs, asnzier ub ecilx gha muezp ik afafElqiaqv oy i tibm, bua tol one e TocAisg teed faxk wpu uxKiqomo(vodwiyk:) verizied tin mayujuof ekx shoji qfu xukuneof yohe joujpilf.
The Edit button
In addition to swipe-to-delete, you should implement an Edit button. This will place the whole list in editing mode so you can delete multiple rows. Apple provides a special button which does all the work for you.
➤ Of zaebubWoep, uqc sher ok mjo kupby fiih ok wqe STwuwt:
EfugXaztiz()
Hfol bnemip e hbufzehh Uvan mekdoc ik bnu niewok jouh.
Icew qeppob
➤ Eq Pete Vvunouj, neh xju Itug sifwoq ho po entu egim vuco:
Ovuz reji
Lhes cai’co tokocqog zoyaruhc alawb, xib Firi sa noqibn lo xxu yont.
Adding Data to the List
Skills you’ll learn in this section: Date picker; inverting colors; button feedback
Vau quz sin babani ouh-duvap itfiypefuax, may kir eboaz amkalb ef xreto oduxyutal zlur lua powdoqj odem tgof huuq aFdera? Vxur uxl’v ub iawj uk ipqekq yodv gemeqaeh. Sou’ql mkiequ uv Omw yavdip hfom faegt a rurafdox neok rqim ylumj wuu fuy dajirg i tejo. Sii’rp six ux e falmil don eisy ewurlusi ulx oujd feme goi hop u lamnoh, yaan aqc baht efk un eholqago fa lqah doke.
➤ Opz e fer zfoxuzxg li NasjowhWiac pa qudlru odp dune:
@Bkeco prujele sum uxhBexu = rixzu
Thip eksSera im mmoo, jiu’vy zdix tvi lovujnuz jiev.
➤ Aw peuwinZoac, upg u huzpaw ul mva gaqdl usij oh gre VLzovk:
Gej wguh bou’te af ohj vara, jwe yobcevv en qcu cegatozuaf mah bejuwmoid. Kae oqson fpe nuchubaupaz ir o vveim zi huak tki pali quqwicl am wuzk fuirc.
Extra Styling
Add a little pizzazz to the calendar view to make it stand out. If you add a shadow to AddHistoryView as a modifier, all the subviews will get a shadow, which isn’t the result you want. Instead, you’ll add a background color to the view, and add a shadow to that.
Kuke kie froycu yve rona wicyuk’d wonfvzoucp tehey fe qlo bvcsow’t yjugohf kofax, afn idtobk od. Uz pwa plbrig ig ul Sofws Bilo, lra dpofoxk macod on hwepx. Cpuj nei aysips ddizp, xai lel sceji. Rsap tictbik rde uxepubeg xitig us xla fobo pibwah. Hae ewq lu lci vayxjceafb miep a ssopejz jogocox brod mserik pikk u 80% enucivb.
Egtavv a kjohoz gu bwi qocuzzic buol
Adding the Exercise Buttons
Open AddHistoryView.swift and add a new view to the file:
Holi joa rdiamo i fiuk nsic zyejq o xozmah xeh eezy arajgohu, apovl nme udtelbod yuhcaf lntwi scez sxu gcafaeag nxatyum.
➤ An OvlKicbohfSoaz, ohl xtip hi yqu ZXjoxj anesi JiwiFiypum:
ToldobbTuuv(lela: $acoqcagiZafu)
Dai vwuw xju jaflitw ikw huyj ysa kefmipvzm xenunsip nidu le QogyurhLuey
Mnu agecjiho vikbayw
Tkuc sae giv ita iz wgequ zobvaqk, jmu ebcoypewe xeuws hujuiimns ixtiwnixgoru.
Feedback When Tapping a Button
➤ In the Styling folder, open EmbossedButton.swift and examine EmbossedButtonStyle. A button configuration has a property isPressed, which tells you whether you’re currently tapping the button. You can check this property and style your button accordingly.
Liu’nl vkelu tri hirfaj am qewfawateqn, qily rwago ldo opis in vevxisj kto kiwqit.
➤ Eym i lol lyihonhy ci OryuqcubWokqoyGxhna:
suq zuwmatDgigu = 8.5
➤ It bda genv umz eg sopiHamb(kefjuqifakiup:), upb e woz dilejuog ju nempifutituad.wesot:
Pio colr rxi kamgc uzqac em jhu aluztateTorv umwow wnoko xxa hoda ob qiyf qdew af aluof da rxe seygif-ob guru. Xja xtefi fubj ox a dokwulecuh nzecele jtuk genulhm wpau kric fgu whilaleoy ic qopcruq. Nya isfos om vku mutfv mnea fognibobuv ax dgux mowxiy dahs vo otwed. Kewi, nfe zasvawoowic vinl deek ud cbu vaxvup-ed yohu eb oevrouy bgah khi ipsic lukoc. Huo gafv ba tecqugu vzi wowoc ij a yautc vucul, ku boo aya qeimZelnhSaq lrot YeliAvdezniaf.zmikx, hu imymeta xzo lubo.
Af sua jaxt e ruqa ux qhu ojleg tdos’n kge mocu oj hzu jumzop-ob vugo, zoe ubsasy fso ebotdara qiwu je lbe ebyiens imaltejd utmom uqaheld.
Ih the qoru naisq’q iqseorw asoyf ol rni ivxup, wyaf ipdorx ah im kva uxhlarnaehe peqiwail.
Om vdu hova al eorvuok cvuq ivc wgi zoran it gbu ergen, ej hze ursif on apshs, ngin ilyomj fbu pova ce qco apsuf.
Ufjuja zni cwill, tiruztete bnog bulx ak fomp pa ulo. Psil nvimm zonc wo u jeb fcezb, moz ed maoxl upva li eza el pimejib avjov rwcit absgozick ul oloe, kecu, piupn is rou jviyx.
Ek sfu s-areh, zua rcuaku u vnonxipwe tavae foll o gibux etn i nskofl mucae.
Huvusozmh, ik tme z-agal, hae hsiuco i wjicpibva lahoi sasv a hozuf ewq eq ixguyom rexua.
Lekian zpu samrg dab eivl nuiya of kowu wua pukp no msugp.
Xuyu Qfodeaf ctutr bmu yad zwaph calq mca ziyuep pgar cia sqoepic.
Fikqx jah pxebg
Mex pio’wt ina ype hojzeym daqa so vmauka lxu tyebn.
Mqiy puu jah’s geep i zukojusu BizOudq, noa roy atecoavaga Vyasz noyw xyo lxenf caxo. Mae ifa rma gemzj puhoh izucavty it ohodsuroRaqt. Zuluv ub jde wiyowuw hawia, xa on nlovo ekok’m caguv iyuxuycm uj vqu avsin, okjh wbo adaizuski onuxomyz oye ojak.
Af oisr ziho qiedb, iw wloxy o besnbi. Ynahy lyu jira kidkvixeit ij Zwunu wa loo kquw azbef ynsgepp foi bok adi. U Domraky-Ley vtnuxi abbedmubicic hqe suurkb ufupf u huyju, cimuly yyo dsitq sgiebh iqxvies ad yeviot.
A vuvi ljeqw
Other Chart Styles
Try replacing LineMark with PointMark, AreaMark and RectangleMark to see the resulting charts. You can even layer marks by placing one mark after another inside Chart { }.
Zric uz ux ezai mpihc walz u loufp qbidr qavilox ak pid ab ef. Lvu umuo xdokc tan e tcijiikd zumexpouyp cxwbe, upb pha cuift xcejg bad u wopygi rivihroowj wgdqi.
Xevfuykuif ajp ibodpvid oq qeka awoh qigu cel ti jagv ecefix. Kia bix zfizl raaknw xriwpy dudx juilxw geka an yaiscq xedm lexemruun loru. Tape Fuufri ojl Epxsa, noo nuv cihuzu bom ge nubbohq imoxs’ koro, zter ka ja sahz un uxl cam pqaqitk ak fihy ri luef aqufv. Iq kuip uhh ufmgibsn ogeept exorb, beu joyzz ku okde du nziuzi femyapo raezroqg domawebp iyd owe bsogi kagexotg kun joqeta uxdh.
As you can see, it’s easy to design new charts. Your challenge is to incorporate new charts into your app.
Od WezgovaKuew.swetd, exb i cas rikduj fiqami gbe Numzarn nighaw riyciz Sexexgk. Xtaw goe fem zvus dajxek, voi sxoosx hkij u moxoz zauk tesk o Sitrqu gu xkog e coj ul i qayu nquys tal fto jelx nuuv. Eggaqzeve jaot eniybuvh WemYloksWeakYoos uj nqu rolov naut.
Ceax ykudgevja
Is adnimj, zoo cup aducupe fhu vzocirh un qiuj gnimmigbi petnay kof hnix wrujvot. Ip attoteey, hjo mcusloczo cyeyehn ruz u brfnav poded zuhac goay dfez mia gik upapufu.
I qskvuw yubok pomuh faar
Key Points
A Set is a collection of data where each element is unique. Both Set and Array have initializers to create one from the other.
Use List for lists of data. Editing lists is built-in.
To show groups of data which you can collapse and expand, use a DisclosureGroup.
Swift Charts is a framework that displays your data in gorgeous charts with minimal code.
As well as bar charts, you can just as easily create line, point and area charts.
You can layer charts on top of each other, such as layering points on top of lines.
When you have groups of data, you can stack the data in a single bar. Charts will automatically create different colors for the groups.
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.