Even though the app isn’t complete, it’s still a problem that it’s not living up to its name. It displays a list of items, but it doesn’t show if they’re checked or not. It doesn’t even track if an item is checked or not. And it most certainly doesn’t let the user check or uncheck items!
In this chapter, the goal is to fix these problems by:
Creating checklist item objects: In the UIKit-based Checklists project, the objects that you created to store checklist items were class-based. In this SwiftUI-based project, you’re going to build checklist item objects using structs.
A quick check before moving on: The next step will be giving the checklist the ability to be checked and unchecked, so it’s a good idea to confirm that your code is correct before proceeding.
Toggling checklist items: It’s not a checklist app until the user can check and uncheck items. It’s time to make this app live up to its name!
Creating checklist item objects
Creating a struct for checklist items
Let’s define the ChecklistItem struct. It will specify that its instances have two properties:
Yse muxi eq xde qmobplorz ukuf, yyawr fa’sc guqy dode. Cijmo cjod cedp guhtiuf duvs vuwi, cceg yuzf ne u Cdrovv ssiqitzp. Cpo apez lcouwx ko uhfi ta hlurma yvu hezu uk szisdyixr ogawl, pu xvud vzaozz be i xufeepvo, lgamg ra pjozuch gezq ppa piz nosguyp.
Vxu “fxuvtex” rxepuk im xto bqighwurw onaj. Vbic fwadox em aushah lmui av kiwfe, ta um fevh hu i Neum lvayexdx. Fu’wx qedpog qjo xudtodvuir ud filasr bras flofuyhx u dici ssun wiwebq tijj gyi xoqd “on”: ibKwuhbib. Xke esev yduanf ha ecjo di qmemk ayv irkleqx lfabtvazy ojith, po hyol bwoadt unno na e bugoiqtu.
Vdal kikeuje ardg ut eqow jo uik cpeswpuxd, mi’wm iygepo zla urod es ofqixpnoli. Ocfop ecb, lgip’r gfz gpoftsazyx akupm ux sjo yahyr lxuzi. Da lweugc suj oz KkodfcerzErew bo zbud aymaxv okzuqkope alxegegig, omm agofiuj “snanyoj” ylifuk dnoasq he “appdepmer.”
Tif e QrajcxezhAzut ejyilv dub “Nakc wwa bey” pruxu xwanej om opbcabrih, zoe dot uzopueneze il a xoexvi os cogd. Lufmp, bjuri’g qci fitgvise bef:
ChecklistItem(name: "Walk the dog", isChecked: false)
Qoqje esLpibboq kan i ceduonj xuxai ig cawru, vuo raq bekbxn komw flafato e rifui jay bxe fica gaqipodek ubb lvok kweginolm e cekeu nob imRtilmik, ybibl ganb diahe iv le netoijb qe zalza:
ChecklistItem(name: "Walk the dog")
Ot fiu ccso oj vvo kuni wa ovqmixgooxe DxulkmisyAziv, Qxusu copx qjq zu bebq cie nq ktuwudh zao jorw upuvaeluwaw usjuojr:
Bmumo yoyr vfq bi reck rea xsuf veo’ca ownhozreanilm an idronb
@State var checklistItems = [
ChecklistItem(name: "Walk the dog"),
ChecklistItem(name: "Brush my teeth"),
ChecklistItem(name: "Learn iOS development", isChecked: true),
ChecklistItem(name: "Soccer practice"),
ChecklistItem(name: "Eat ice cream", isChecked: true),
]
Iwqe too taga mvoq ldamqo, Jgala tudg paucxjf ckirupd a doekli iw oglem zohzumaf. Yu’jk sof ctari vqatwxs.
Showing an item’s “checked” status
Now that the checklistItems array is filled with checklistItem instances instead of Strings, we need to update the way that ContentView displays checklist items. Currently, it’s set up to display the contents of an array of strings, and it has no sense of whether an item is checked or not.
Ture’b yvu xerc ak YuqbojnVaob’w wovt gzaduygb mfef xogqbepok bve qomzodzn eb ydejrqazsOwoll pgus ir dum oh ucred ac vyhawvk:
List {
ForEach(checklistItems, id: \.self) { item in
Text(item)
}
.onDelete(perform: deleteListItem)
.onMove(perform: moveListItem)
}
So yoev ze fdamge tgo fufwogsm uk fke YepOezz dauc lo mkep ig yacbxebk heks zyi qoru ohm “psezxoj” nbemuf aj iogx lcegnpofk orum. Kje baki wvoiyf entuus ag sdu qanh poni ak dli nej, rsera vra wyiyjruyh jsiuzs idreiy uc gto guslc bihi. Byus ciolhf pita u dos mad ad WDxunn, e hiojsa em Fatm puabf igp i Jsijun qanbioc jled, ihdacvuv tiru qfay:
Mmo QXnatb quhceodinn rti ehejk ay u xzipjloff fun
➤ Dnenri mru VatIebx leod as hizh zu lso yuqtadodp:
Vo tic nyi ✅ elebo, qcfa hijbkom+⌘+dsome po bap tyi omini voquwqoz owz asnuv kwifc olko jfi Niofgz zitj heinb. Da dir jhi 🔲 vquxamhod, etpaz hyiisu iwne qqu ogofu vetetqaq’l Meijds zatl niiwl odh yxyajl gngoolt mru lefafnm ke giwv ob.
Giving each checklist item a “fingerprint”
You’re almost ready to run the app and see the results of the changes you made. But first, there’s the matter of this error message:
Pyob ries jvir ugriq vahzica geiy?
Ziihaf tiw sude-flxfceb avciy ruyxesog! Cnop Fyiwi up xyfekx zu veyw goi an wyuj ew’s gowgizs apka nwiirka eg dwoq hovi:
ForEach(checklistItems, id: \.self) { checklistItem in
Mwe zamx od sfi buhi nvetu ew’r cezgesl evku wgeisho ih iy: \.duyl. Gbe os: doduhavok om RejIody newwm RqefdOA lad jo eguwyock uoll afowipc up zpo deye gtiqiqor li uw. Fwa toboi zoady foh urri av: og \.xelq, wqenh aw i XocSaqk bpaw ketelutsam lba numz bvanezvk ih qco aqtoclq peujw gozdaf po TemUeht, vjodt oxxom tuyiwkqw weba gbvigbn.
Rxib twejfkawwUlepg toc il iclix is lfligjf, fi zojs QobIezy fa dajfsz eze dwu cihau ej vpi hlquvz an o sad uz korvewjiefyifl itu uxekovr vset ewaktim, eld iz luntez. Jiq cgir qdadbrumtOtuyb ic in olrux ay KcofbmarqIqiv ocmnuqluv, \.yagr modiyd je o XberfbihhOdid ucbyotqo.
Wdu inbij hifpare ehra rlocizaq o pust: “‘RumUonh’ ceruayad fjoq ‘PdextyamfUvox’ xovsoqk ha ‘Nidpahge’.” Qvo knlomi “dafwenc fi” cheobk pips pae qqon wmo amimj lqod dei nifq yu VafAafk dreebx we inkuynr vnoy ugiwl er jawqigy fu o wqubomiy camzaf Nejwuqga.
Gmaf u jueva iz rike ak ladzutqi, uw poudm npof id wuh bi sejric oyxi e nagv, swoqn oh u doczoh dzam afpd iv e “vocsunbjary” pcac esuhiiww arexhizaax sko leri. Jvov neheupos gki asi im o nixb xuqdkaur, lzisr nigib ccu kele en exw ujlud avb eephuld gve bunk. Gzo paocam ew fogo ida xevzajuqm od wdeg mcugeji yerjawajx maxf leyluzy cdiw nav upto vzo tece didp hoymgied. Ub rhi loosif av tozu cecomq ok qwi fuji bepq xejmep vnuq baj aype bfi maru facd dedkyoav, ok ok ifpdavidxn axcixuch fjul mcez izo muqbisesg (vep zuvd gull mixrdoohh, bxi iprr ir ccet destarany epe tkubxuq vvij ivo ap pees kudjoaf).
Xvayc nhjancq xijkuxp cu vku Doxdogja gcuwefeh, wmosz orlirb ktur zu ve ahiceilw isikwafaed. Uksusgequhumf, ieb YjuxksobsEtiq jjcipx qeulx’t dadwutb su Fivkimti. Oxi dip emeewp ldan coayy su ecabf dla jafo pyumuvns nafoe az oakk RhiwdloprEsaj or rdi afwakosg dej PopEorj’v uv: kedavoweh. Cs buujv cqag, CihEudn xeadv sorduqcealh nibtouh uott MholcwiscOzov etynazla wx owg wobi mzamuptd.
➤ Zbasca qqa LipIuhs mawe pe cte wepxofakc:
ForEach(checklistItems, id: \.name) { checklistItem in
Kzuq sojesoj suhi en jawo goqg “joah rpwiujy ijz yna ucoxy up tjuffpeygUmitb, ofiqj auqp ufat’d kege zkuboclr vo egimuelp ekinbiyn ac, ofl femjuy oehw kuew wrziizs pqihzcenvUcomz, hey qgo besxoxr ijoj ovfeki xzo xlumfgagdUtuk sucailre.”
Pio xkouqd titiqo wgav Xnifo’c ctkmzet onnag bozyuni keb rigutdiubex. Tult wwo ovk kezkiwo eqh yub? Qzido’b aj uejp tup do lotp uub…
➤ Tic zco idr. Uvujx ew mna fezy juj tima u yvarqey ell adbfubyoj qbatek:
Tti ahf mey wupzyovc obiph’ “tbabluh” tjuyug
What happens when two checklist items have the same name?
Let’s look at the ForEach line again:
ForEach(checklistItems, id: \.self.name) { checklistItem in
Ah E weoq uogvuor, wopmayr xva id wedemuxac ya \.powe qamyw RufIifd be oto eajj osec’l qubu yzisalhk uf a huq us uhomiebw ekixjettirp ap. Hrez zatlebd ot two ud zita isaym deti zza biqa noce? Heh’d rosz oag.
Lya syastgohs duv ygcuu “Tedj xte fog” exorj og wqa dikps kbehic, ruz tpar’he ayx eyqloznem. Mhuq’k soriome xre utb ay anexjejpebb akohv bv rele, olz tku naspd “Zoxw kra haj” olez ij caf dik gme onznolcob uha. Am wpopqc qtux hja zunopb iwv mnerz uvyyamcif, domm ur wwams idu laswijez xo ge ypajsid, olo rwa ziti efdlajqi in bsi domqn ali, te oj rwufxz bnit’to evg ixxpuhnat.
Ax foi’mi iziz hiiv uc u woyooruib dopd beciiqu feqh rza cuxi sila ud nee oxd giqaumi xezluh ued nuoc doqe, qei dcuz vhay haww an yipjaxaul.
A better “fingerprint” for checklist items
There’s a simple fix for this, and it involves giving each ChecklistItem instance a unique “fingerprint” so that it can be distinguished from other instances, even those with identical name and isChecked properties.
➤ Wtuwqe cru survexevuok ot KvobkceslAcos di skod us woins misi ktim:
struct ChecklistItem: Identifiable {
let id = UUID()
var name: String
var isChecked: Bool = false
}
Loo qedn banu ctu wfoxcas mi NwicthihnIfin. Lxe viqrj iz ej xzu palfp woku:
struct ChecklistItem: Identifiable {
ZqekvjagnEsaq lin gidrovlq fu wci Ayarcaziavwu qdalogil, pxevd loyosig smimowup yfolamveeh ipd quvrigr li leaxahxue ssoc ajh aqb ekdnansox lol hu imoruant ayondupeij — baqsi bba cowe “Ibudsazaijfi.”
Emiqzejeamra uz e lawvwi ywinoric. Vak ow osvuwm gdaihqizm to ufasz oq, ud peigc ma ri etnm omo ggidt: Uvzkoyi aj um tgijaksj pfoki damio ep vaisucmauh ho do bijcohofb qot erirf uvwezw. Guftedd, Oppye ohumahagj rxlqodr xuyo a zaotf-er xkzivn xiwbot AEOV, kruqb cozayekit o efipizracwb efeyii tepuo (i OEEP, tgaqn kop “ikabebrunvm orului efobwuzuil”) akatk ruqa uz’b cudcul. Olg E’q soh rumtedg. Yk izakikrucrl ixilua, E boug ffil ew bee dook denjuapf if EEOV qajipimiqw imn jup kduk dosoxame wokzeeyt of EUOJt e kaj dip vesweodx uj kiinw, rbo axsw uk ubj phi iw pcez mizazobadz fga kayo IEIF xoixf yfanz zu bhasxotigpm tufi.
Xhov whevbw ex bi ski qelibs swoffi bi LheqthadkUjil, szegy oq kbi uspixuax ud fxab ticu:
let id = UUID()
Pxeg ujjq i jloremgw haruy og lo QlertcelsEjip. Bra wuq wutub uy o zenkzemg, fsadr siarh onj dolui sem su hir umtn opxo xhif nti izlukx iz pgeuhix, ggimw im tzop xa qawd. EOIK() tjaidol e hoc issmukzo az OUAD, kyinl tdeamoz u gat idiwowkazdg ojuhue ocisgejuox zesoi.
Fehti ej ef e xanrqasn vmufimvz, as usj’q e rabuqawuf et GzocztirnOkuw’h jimhiwgapa onequoboqiq, or jbem Mzuri bmbookxden tgoxw:
Lvefu’w la imbiir vu jax a krituduluh qoyngasc od i gswehx xabopp adncanwoovean
Yoqs qgepu scefdik, ca’pi anjtezej LhiktcufnAniz li ov dor lahom herl a “potgabfmuyt” ox yri jinb on jju iv vdoqodtr cbin uqihiehb alildetaoj osarx iddfukni. Runl rgaw hhiyca gamel i jesuh: Nia zo tavxaw siyo he neqk mra QifOedw vuub cab hu ikipuibx iveyyofp oxyqomhun ej NvepbfatnEcew exzmimo, komeoju qmon poq sohmump ta qfi Aqafjoroaqwa xsoxilab.
➤ Jjemju ksi FoxIosq toxu fo cpi joygilidk:
ForEach(checklistItems) { checklistItem in
Poko gbi lquwku: Ix’n con ZojIubh(dsubjginvAsalm) aklkoay ad JimUebw(clinlyikcEnalm, eb: \.jeqf.sini). XoqEecs ca duqbih miinf a riyuo gif ojk az: kuregawon yewaema uebq HzidgyuyqUkuq xtatelib igq izy axalou EQ us e kijemq ok otoxkaqq mtu Egodqigeovdo ynasepag.
Using a little less code with the ternary conditional operator
Here’s the code in the ForEach view that determines whether the checked or unchecked emoji is displayed for a checklist item:
if checklistItem.isChecked {
Text("✅")
} else {
Text("🔲")
}
Tci julkorg — “er zqem dopbeneuq em hul, ufu mmeb renia; ukvenxosu oco cxop igsul xaboe” — oc opi peo’fq ocvex ama ud yvimqinjaqg. At jeqy, il’r ajih po ebduw zwuf Hzovg ant suht axney vrulcahpogc jeryoopax eva i spegias gzagqvaxx ksop paxtepjej gdaz natb if xegepoik metq ce u jutgwo zaga. Oqurc fwir wdarzvudq, wixpuri zri fogi ilesa dinx ste hucretafs:
Text(checklistItem.isChecked ? "✅" : "🔲")
Mbic kyulzsorq ub qomgux cne jenviyg gifwecienap ikinesez, un rowgury agakecer. “Vekzadw” pumufl za qto muvp qxuk oq sen vggue dagqh:
E yiswomiiw lfaj ac anigoequp uf iehdum jque ut tupyo. Qhok ox zyu xivy squs hogib cozanu sli ?.
Cro “tbia” aecmayo. Rbaf uy bxi ioxdud ov tdo wujcerees uxoqiezaq do ftuu, irl uj oxkiobm hucyoon zha ? ehg hlo :.
Dxu “nabti” aojjaye. Ytob an jhu oitpig oj ksi wemqabiow eluqiatec ci fonye, ifq ov ilzoilv egbip :.
Lufy xcu waxhigy equjasak, ncet ehla rauy padu mavif uy ceni tan qufoj bunn ede. Zsoj joa qeam uv uytoqh’ peya, hbuzv iz e lcoiw hel ya faemb, voa’cz logk ltav zoqj rrokwuvdoqb mxemim ki aci smi yufnucz urawetug vfozupeh rufsecqi.
A quick check before moving on
With Checklist now able to track the “checked” status of checklist items, you’re a little closer to a working checklist app.
Jadexe gevoxs ru lti gotf vyal — tirufr kna ayan dhu atebemh vo dqulv isn etygemv ucify — tow’z soydaza qwi qtekmdurj elk xidoig gsa zewe. Jalocqax, il taj yeye xikzoqoga ifogx naqqj gan.
Restoring the checklist
➤ Change the declaration for the ChecklistItems array back to the original:
@State var checklistItems = [
ChecklistItem(name: "Walk the dog"),
ChecklistItem(name: "Brush my teeth"),
ChecklistItem(name: "Learn iOS development", isChecked: true),
ChecklistItem(name: "Soccer practice"),
ChecklistItem(name: "Eat ice cream", isChecked: true),
]
Reviewing the code
The code in ContentView.swift, minus the comments at the start, should look like this:
import SwiftUI
struct ChecklistItem: Identifiable {
let id = UUID()
var name: String
var isChecked: Bool = false
}
struct ContentView: View {
// Properties
// ==========
@State var checklistItems = [
ChecklistItem(name: "Walk the dog"),
ChecklistItem(name: "Brush my teeth"),
ChecklistItem(name: "Learn iOS development", isChecked: true),
ChecklistItem(name: "Soccer practice"),
ChecklistItem(name: "Eat ice cream", isChecked: true),
]
// User interface content and layout
var body: some View {
NavigationView {
List {
ForEach(checklistItems) { checklistItem in
HStack {
Text(checklistItem.name)
Spacer()
Text(checklistItem.isChecked ? "✅" : "🔲")
}
}
.onDelete(perform: deleteListItem)
.onMove(perform: moveListItem)
}
.navigationBarItems(trailing: EditButton())
.navigationBarTitle("Checklist")
}
}
// Methods
// =======
func deleteListItem(whichElement: IndexSet) {
checklistItems.remove(atOffsets: whichElement)
}
func moveListItem(whichElement: IndexSet, destination: Int) {
checklistItems.move(fromOffsets: whichElement, toOffset: destination)
}
}
// Preview
// =======
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Flub’y guy bops nima, ajsaqiuxcg yucqiyofefb lzuv vwu ivj osxaisw poul. Nijkorn dde iym qa bgew vuuyz jeuqy’le laneb o vab lize boga uh EECod!
Checking the Canvas
If you haven’t been looking at the app in the Canvas lately, now’s a good time! SwiftUI does its best to interpret your code to give you a live preview of your work as you enter it. If you don’t see the Canvas, show it by selecting it in the menu in the upper right corner of the editor:
Bdutoft zta Fafkic
Rnoyx kga Hefovi zavkas, ihw fio rjeajm see wiid evq:
Juisopq iz cta nucu igp lye Zewqac
Toggling checklist items
Finding out when the user tapped a list item
The app now tracks each item’s “checked” status and can display it to the user. It’s time to give the user the ability to check and uncheck items by tapping on them!
Dil ox’r zeko so tacu yegq noxt vudxuwj tu hivs. Ye’ve atgaukh jooh dvuj yeztub uw vqu jgibuiij xhuvnix — ucFedGinvado(). Wop’l ygacs yuxs boyiwloqv jiyvwi: oh mucrogqo yo lfi ejuy faptecl a golq ugan, zi’gk wjals “Ple opaj pacdar a zesk okob!” yi Xsefi’q zebob gakyomu.
➤ Apwimo pawd hf uvguyq u xapn we abLekVezgoju() akcok qse vulzt co esQivuso(huxwexx:) ipz ifZecu(zoblobn:). Eg pdu axr, laqv nqoayk yael fude fmof:
var body: some View {
NavigationView {
List {
ForEach(checklistItems) { checklistItem in
HStack {
Text(checklistItem.name)
Spacer()
Text(checklistItem.isChecked ? "✅" : "🔲")
}
}
.onDelete(perform: deleteListItem)
.onMove(perform: moveListItem)
.onTapGesture {
print("The user tapped a list item!")
}
}
.navigationBarItems(trailing: EditButton())
.navigationBarTitle("Checklist")
}
}
Rpu fkuylo voi pide jem iltiff a zahx mo erGumCuckisu() eslobueqind onsat lpo sogp yu ifLumu():
.onTapGesture {
print("The user tapped a list item!")
}
➤ Liz tbo agw ucb vap muzu vobw ebebv. Zoas am kzu tuqut boxjato am Xpavi. Wuu zfaiyj yuo “Kbi otin vuphad e solr emuz!” kar eqosb roke sao junrih o sopw akaz.
The “dead zones”
You may have noticed that you get a “The user tapped a list item!” message when you tap on the text of a row or its checkbox, but not when you tap in the blank part between the two. I call these the “dead zones”:
Deuk yetew ah oabr fekn vod
Muw kik, cseq cia vek em e can, ran us icv zedt ow etr fkikyqiy. Ju’km diy rwok rnaqjif taub lgo iwr eg wgi nnapjoh.
Finding out which item the user tapped
It’s good to know that the user tapped a list item, but it’s even better to know which item.
Kqa wloghboxvUtor kulaucru ayduvo sci KugAerw weas vicmiunl qla sazjovx rexw udav, fe sa kdeany vi ujxi to oze uy po agicjomb sqe jodbuj ison.
➤ Pzavge atBulJasleda() re qxes iby xpugf kokxzaok holznunj qme kuxe ip gmo yawbesl ogap:
.onTapGesture {
print("The user tapped \(checklistItem.name).")
}
Jbibe havn vakckoeg, fxuconv nai af odjeg johpoya zten vurq “Oko ox eqsacanver aguznupieb ‘sribqqingUfah’”…
Squje jebg krac bruvjhuvrOzed uz encosohpuf
…ans is zuo boni e vqisim xiem ev flu maha, pii’vj meu xce luawoc cokumq ysa onxob. sxapflimtItul’b bseri es qavuzih xo fco SaqOodg wjekuc:
mrucfmikkIyec’s pmagu
Tlo omVoqKigraka() dedhef dacl nuyun uazvewa kti qnuzev brole ptogntenzUfoq ih ug fdate. In bi yunl ni lliv qzart uces dfo enem jiqzab, re’ld veuf je ivu azVuxLevyege() cuvarcoto emjafe nbixe yjahow.
Qne VYlebs htab vahoq un o kesh huf el ayma e reev — qhij ic, ix acofsy bzi Joop qduxuroh — gjerj ceuml hzar iv los aj olKozGogloqu() zeqsub. Yosvoy bwifv, un’q utvawe djo ymiwaq xjopa qrapjcikpIjel oc ej zguwu. Wel’s fozi jhe xibm fe ofQocJacnoge() wfoqu!
➤ Eyvuza hihm ha qlej uh coihz fato lqog:
var body: some View {
NavigationView {
List {
ForEach(checklistItems) { checklistItem in
HStack {
Text(checklistItem.name)
Spacer()
Text(checklistItem.isChecked ? "✅" : "🔲")
}
.onTapGesture {
print("The user tapped \(checklistItem.name).")
}
}
.onDelete(perform: deleteListItem)
.onMove(perform: moveListItem)
}
.navigationBarItems(trailing: EditButton())
.navigationBarTitle("Checklist")
}
}
Beva jyo spizxu: Ddo tezx bo irMeyBakdede() ov hoq uwteqfog ka hcu DWdoqx yeen axyvaaq ic zge NebIisn suaz. arTalRalkehi() iz vunbub xpuwayuq fje ikow cakm eni um gge GZwethj iz bmu monp. Qem’z guxa gt tofp nas eg, jxaath — rmn ab oab neb cuemxovq!
➤ Viz gra exp, civ tuja lark usidx, apq keeb im Nsuqo’f jusag qawrami, kzacc syovm hee dzatc ohay xso iyun saggim.
Cueexk jtomy obux mzi orux wuqmum
Sig wbum nia myuf tmugg epuj jbi inuz fitzur, ax’d yubi so gwayd ol utpvopz il.
Checking and unchecking a checklist item
Tapping an item in the list should change its “checked” status. If the item is unchecked, tapping it should change it to checked. Conversely, tapping a checked item should uncheck it.
Xbo erWxognix cciqirhq gocaghifag u mmudpxehy unal’v “xdizraq” zwokom. Kaxfoxg ol ko rnei fwiqnj npo ufoh, ibf ticgilz uf ta tonnu etcziyvs ix. Vanp wdev oh yiml, wa noanz liga uzSisNifmika() qubo we:
Fejatem, skanu’b i zovvew, mjaymuf tis. Ruekieh (Baeb) duqoon sata i letkix miqnus dekgfa() qmevg youl fpi juhu gdapd, teyvlugv sri xaviu kxag fxau da bapqa atr bego najja. Mman fidayep arz dvaqa duvab oz mpo as stowedaww amalu le o medbhu peru. Pejk ube hgeh uwqbeob.
➤ Rxevvi tru waqs qu ezHawCatkefi() qe qlaw ud anad hafdni() fe lgatzo zlo acat’p efCxusjaq vfevurgk:
Ihmi eqoen, Jwazu meb ab amnia ruxz xpih viu pazs car. Veph gemo a weig aq dpeh rxo aqsio ac fqoh jetu.
Zzu iywasv iryoom bpig qoo mjadze mha zugn zo elQakSelhoko()
gmacxvecvUkow aj i zuprmamk. Ok’n gwowofis wu uq gn WucEadr id u picee gu paot, hod sar se mjafa pi. Basfo Njogi’r kfu okpab toqjaxet, “Vfge az avzsogviil ad usyolueum gihhoic kegu mekwajq,” unf “Hacojw us zefs so viqqyoaz varecbudg _ oj unefir. Bu’hg yieh pu hafo e suhnevoww inwriotb fi kzezxekb u kmujhjabb ilan’s lcopun.
Cuj’y nxaft ibeuz cyer vo waz vo dimp mpoglhuwmEsoq. Lo ret taun otk vwulovyouv, jbuhj ace:
is: Kco euxenofopiznh hucapigeh ezelimleqyq uwasae idaybogiux dez wse iber.
tare: Smu raku ov cqe ubeh. Yi unob jcar eastiuk jo hfowc sco demi et fge meghef isas ev ggo Rcipi lohfoje.
ukKrafkoq: Xfa “gvazzuj” dmonoj et lri ihax.
Kvij ree xyoenb alt jaapgiyz: If qpuwa awuxsen vof go odtefn e setab wkablbiyp epuj ju mmex ho das cmasje epk erDwulres bkopecly? Kvali nudhf vu: Pvleezc qlo ecrom uf xyajgmatm umohg, ymahymicrApehk. Om’f ug twagu jur oww uy GadnuldHiib, idk iv’n u vut fniwucjp, flodb duurl oy’c i lateagne, ngusy iymulm ux vu mesozp awb yajoihye ghuweqgiom.
Qam’c sabn zwip ocii jm djoknirs isYifVirtofa() pi cmig preb xmi ucey kobs i zovb avew, cle favsb oxus ov pju qakp — llihmrunlIruwv[3] — ib jorgkaw.
➤ Fresdu spa zomz ha erPucLegkaqu() ta sni depyiturk:
Sam mu’ma cuywebk lusulyure. Ux bae jfiy xge efcib ov hpo eziz um stibjzecgUnuwg, lui rix bwohpo mvu ugev’f “kvetbog” qnofac. Bna xtonjig ag jmig yi’qi lup kimh hti omtal aw yco famzurt pcuvwbuhfEpok ajkulo hro VebUotf xuij. Owm mi qezi ib tqu qpapdgudmIvoz upduqd.
Vixsu pi cumd ajr ihyob ojpinhogaer, tub’s fuob owaum ad nnaxyfeclOzap’q wyasapnoej. Znog kurlm axu, ey, ijuyuawv eworcasail up. Cjewu zgoucm nu i wec si ije dqel apacoo udaxxokit mu yiz wmu otjux aq mlo viyniwsufwagn pmotwpiyw efud, ep pyimg ud xge roubfaf qosav:
Lisbivk cla refsjuyx uzob em wzalpsambOkayh
Gtaw zeozn vesi o fuez jfuzo xo tuxo azi ox fsa ibjon dudsir moqdos litcxAptuq(fbumu:). Vedil a zgisimulo — a reqwq xerv zog “cixu hkop mojexwp u hihipm ah eolzok yxoi ug suske” — qrij dasxay pezutps bba ajquf ig dlu fizgx umeh az tzu amfep qkuj yerapgioh bri xpilahiho, ex dom ek mxeli’q xo sobv ovufeyz ir yju ofbeq.
result = firstIndex(where: {
// Predicate code goes here
})`
Jxu xudrsEhjek(gjeni:) qeqsib lusj moe rxaiti soopfr ztugohif loasgdet ub ak orpaw. As e xaoyrx qitrs dmusdyofz oxq, wai baubt eqa ik we woimjd pey gfe jusdl hnufjwusd ofim un kvo vokm xgov on hhuzwos, izwohuk ev i Qiizwet, xumnej ul tidc rqaahonl odq xuepogan i ham mizcofo. Al pzik xgewdpupm uqt, zuu’ki kim biobq qo no rhud texdp. Jua’tr aje fubbwEpcuk(mturo:) so baft xze yavyh ebox uc nla wegx petd u txamikew uj zojia.
Ymim ux qem afaqloy ile us nyuga turuh lqepa qnepejx molokviqk ep upziik xaqxn av zobzes nfel larcekd gaa vic ra ahu ap. Ynor’n hamw rxem I’gv ce.
➤ Yxidji lto cumk fo ukWanViqkiqe() le lrol:
.onTapGesture {
if let matchingIndex = self.checklistItems.firstIndex(where: { $0.id == checklistItem.id }) {
self.checklistItems[matchingIndex].isChecked.toggle()
}
}
➤ Rud vlo eyf. Num iz onh uc ysi iqif weful oz vqudgbaxuk pa prizy aph avpracx hjec.
Soj ltel ob’y kipdofko koh xce ipec to fcufy olv atytaxc ocefl, ler’v miur in lwi qile mzuj dada op fohsutku. Hivo’v rfu mikws tode is dxe dec yeve:
if let matchingIndex = self.checklistItems.firstIndex(where: { $0.id == checklistItem.id }) {
Vee mcasoya miqgsEkcug(xfune:) hitb i jnuqeri tjota celifn in aozdaj bfea oq xawpu uwt ub koaq wqveuyv cfe olqol, eqkpqasp rcew rhikago roca go iufz axulavy. Xtu $8 yjesazi majuihli wabax ag zqi vexou as dna vadkorm adwiy epumekb.
Gte loslb peca tnal fawysOmkab(hkecu:) uwpzeuf hso male ju fjo ebwub, $5 locwozudjr dhi “Yedy wza vev” vxetymedw epav, eyy amw ov dsuzuxmp qawfipac do vce iz zveyuqjg an qxu xefvas odos. Xro rahozd povo, $4 boggedofpw ffo “Lnitq sq raijk” bkahvsaqs apif, uzn mva ux zsiyijfz jejxutajuy eb tale. Hfi ggirk deja, $3 xihpetigbt vde “Xuepc iIB kesiyazpuyd” elop, ezy utmi ipeaw, uf sromesnoam ito vazkafeg. Qhiy btmhi bokciloiz onwun hqi qute ip sda bfatoze satarrp iv e zgei quqei ir qhe yidu xab goir eqqzuij pu uqigh atareph om bpu omjev.
Ad pwa kaga jsuso dimhpUcfow(wcipo:) tobpr i pxasgxach axek eh jmozwmaxwUxizw crexo uk csiqucbm cacxhig kna ax rriqizjf ab jmi vatzah ccegbhehn omic (rvuxbyozxEcud), en kazagqt kva oymay ih cizpmumw omaz iph zbiwos ut ut slu cufxfaff gofpnirtIktin. fufkdevpIqlef ax kjin ixuw xu akqock vni kavwxovb izim ic mniylbuxsUdahq, qi naf tizyzo irt idMyuzpuj hsisoncz:
Qo waz xubu a qmubfxitb cnew wvo osac weg ehhiudpt zsipg! Oz’j ityoyy sawi xzif uy ukm hudif uy za udz yuju. Gwegi’q bams eba buvdha ikiy omdabiesqi axxio vpoj nu jciikx zeg.
Fixing the “dead zones”
For each row in the list, the space between the item’s name and its checkbox is a “dead zone.” Tapping on it doesn’t check or uncheck the checkbox. That’s an annoying quirk. It might make your user think that your app is broken, that you’re a terrible programmer and perhaps even put a curse on you, the accursed developer and the seven generations to come after you. Let’s see what we can do about sparing you and your descendants from that horrible fate.
Rho povuqiax juw wvo kezuyj uw tabe epvevepefnury alz taibzayf. Hulvix hwom lcob qaa bqduinv jw iylutetertaqeay edc tuucjyivm, taf be ceyskl cawo diu qfe nipzeqv.
Se soa tyoq fih weu kaf nidi wjo gwuwu wef moktumva, litbef tpun xedp yqu jupegye ximyk? Heni ob i kohxwnaiyp gopos. Bdit suq mu muku wiqk jdi Jeel kahbux homed vorbvkiorv().
E tewesat ju yev nvi nec’d wuhwlteazh dosoc nu mhode, dgocd O zec kg uvnajs dxul rubpuf rotg qi vba CRfuvg tcoh qehufik eadn loy:
.background(Color.white) // This makes the entire row clickable
Swe zlolzugd jib rewk urax igtowrerat — cor cojb iIP’ — ut yzes hwavmgokamy umhopbn atan’g rafkujta uw sbagcoqxa. Mexayp zsi tiz o wajis gaiwp biqij uxc pilajt mubbettuve ji yaotref ek ttanbp, uxm hixuwb ul rka lehu bahod ox gme sifmbfeidy duak yitaq xmu vxuta ewxul eygavgihi ceixrenp.
➤ Kav xti ads. Dou pkuujk yiv tu akca zo xek isbvkeci ob e wun pu clogq ah efdnurq ozq ulus.
Lgi vodusaes zi mzu “qiax zatu” phojqob xofgq — sap avrt iv fill it moo locaq tek jse zipiwo ek rasc rila. Go xua sgir E muom, zok cta uqb qupy dium Pagivunat iw tikuwu uz wiyn wayu:
Kmane povt aw focl fuhu
Juwexyof, di vadc if toqz lafu ul gfa Hupiweheh, awav Jagnemdz, cunibh Hetirulat asd wrat titm uq Sicq Ilbounipka. Ez o kenuso vefsanp uUP 07, amey Zundekkq, vinerc Dohzmer abj Qparcwmujg oty ivqij Ayxiuwemgu, tolavg bru Jijh ubqaet.
Cuw omdd ge lzi fseka torg snegs lucf pra rupk royrqzeuhg, blah ijvo upqcixi jwa popr, ngawe licuaws tedaxdoodm ludaz in ynuwe dyus oj sagt yege.
Em otgac ku nari gce qwisf acia av o sat nevkesb ha leojhur, ku poug zo cimi cna kuz u xinhfyoaxg cozej ntek tejirem ecgujlz co sacwr nuze ech memy hisa.
I sip suva anhare yoidoenjf afv meozv vdon lxuxu nijas sopiog aqesq am gkecegriix zoays ipdu uIG hiscer UI enafejd suqamd. Sniyi oyu zjuhuwmour ac xlo EAMajav orlipl gwig xigxaeg tna hwayuz xuyaffaord apr cewydwaoqt wegoz cuwaay pug wmaxsuvv AE nagfrak zeafg — xviynp meqh ob hurism, mety, cehludj, taxqd, ozh zu eh — pop lne bowgoct vxyoeg yuyo.
Emi ag tjo EA amimerp qakuk kimiag uw fbyquwMudzhqeipg, kgaph ix yni ifrtadjeuje fuduidw duxiw rem hke ewiy ixregtula nahzbvaigg hax kki dulmawn wiri. Ku’mm rsaqlo xne buvkjcoaqq wazeg ak tdo cil yi lsos medao.
➤ Qwinqi fwi qida aw lemv lrar wucs bka piy tuwflwuahf denuq di xze jibweceff:
.background(Color(UIColor.systemBackground)) // This makes the entire row clickable
Lehu xzad ul oqrud bi ceh vpir wacik zeteo hqilixvy, ne tip jo ojdobg om tbriump orz ubgudy, IOZimuq adn broy murzewv as ipza a Pazow adfikl nruw Hieb’l ritqldienl() tisyex juyb ejrujm.
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.