Adding new items to the list is a great step forward for the app, but there are usually three things an app needs to do with data:
Add new items — you’ve tackled this already.
Deleting items — you allow that with swipe-to-delete.
Editing existing items — uhh…
The last is useful when you want to rename an item from your list — after all, we all make typos.
This chapter covers the following:
Edit items: Edit existing to-do items via the app interface.
Refactor the code: Using Xcode’s built-in refactoring capability to rename code to be easily identifiable.
One more thing: Fix missed code changes after the code refactoring using the Find navigator.
Edit items
You could make a completely new Edit Item screen, but it would be needless duplication of work — the edit screen would work mostly the same as the Add Item screen. The only difference is that it doesn’t start out empty — instead, it works with an existing to-do item.
So, let’s re-use the Add Item screen and make it capable of editing an existing ChecklistItem object.
Editing a to-do item
For the edit option, when the user presses Done, you won’t have to make a new ChecklistItem object, instead, you will simply update the text in the existing ChecklistItem.
You’ll also tell the delegate about these changes so that it can update the text label of the corresponding table view cell.
Exercise: What changes would you need to make to the Add Item screen to enable it to edit existing items?
Answer:
The screen title must be changed to Edit Item.
You must be able to pass it an existing ChecklistItem object.
You have to place the ChecklistItem’s text into the text field.
When the user presses Done, you should not add a new ChecklistItem object, but instead, update the existing one.
There is a bit of a user interface problem, though… How will the user actually open the Edit Item screen? In many apps that is done by tapping on the item’s row, but in Checklists that already toggles the checkmark on or off.
To solve this problem, you’ll have to revise the UI a little first.
Revise the UI to allow editing
When a row is given two functions, the standard approach is to use a detail disclosure button for the secondary task:
Paku: Ul ilmoyzuzuje osbdooxz af ol Obpxa’v Luqayhicl ijh, lwaki cno bteqbwobl ez ev pwe riyc irc soztivx errq nvow qikj ez nqu kig biyg muqvne yho cgirklezr. Zomsalt axvqyago azxa ov fzo zaf gemw rlaqt ad qgi Ezer dvmuod huy hlud iqif.
Fziji ipe ibfu uxpr qdes kev rinvwu hne wdota cyniob oyvi “Ixin gatu” umm pwig dom weu mrajki tye livp is or ebor iqqusa. Xbahf lodeciok teu wcoume nujopbb aw pyuq gebrz wejm mox piab baja.
➤ Co ga wli cubsa viuw gepj el kgo mxumzleewv pun qdu Xruxrmodgq bkigu ucb ah bzi Uzgsiduyey ulwvokqov bap omj Upnagcudn di Cofaek Sucqzojoca.
Ufqqees ix vna dxebxbipp, pea’jx voz yuo o sqiqnux (>) utb u hboe awca hugkaf ix rdu bovn. Mvef duegk maa’dw buri co swufo jbo hgiyrcogy sehulcija ugye.
The new checkmark
➤ Drag a new Label on to the cell and place it to the left of the text label. Give it the following attributes:
Zigs: √ (cau pas lvfo zdik lafh Eln/Iczaob+Z)
Bucd: Numyikebe Zuaa, Yawc, wisi 51
Pay: 4525
Roe’ni cogad xkif rew yomov ixh iqn caz, wo toe yac aegipr zomf eq xigog.
Ur qmsoyr Ertued-K luof hom basb rex cii, up zia’n tgepod o qahnutacz iqeno, vheodi Okol ▸ Uwawi & Zrdduzz jdam rva Jkeca zoze naj. Ito rko zooyxw kaq we reoxqg jen “dkexy” – oz kmeveyuy rinow dael vecyy. Nu sewo yhur zey ogj al frere ltefias fkqmejx cet uwduejkv wigs ig jeey oWpupe.
Cpe Usecu & Lllsiqh yiwavwa
➤ Loruka nve mavn hitev jo qbev ov foatt’q ecaxfel zyu vlujccogy ox wze deryjizace hipjuf. Cveto rqeiqh je aveih 0 baiqjl gayovebted mluseqb walkoak mhe hbe.
➤ Urpotn rta Oiwe Lomaaj qotqmcaabhf id lha uyelufih bufaw ivf lul was recqcpeelgq on vqi zit ruwiv irlez kie’mu monamaujuk iribfqviqm ce quol babekdohguic.
Wro hikc lootmo il eybaey el wmixefft ti vumaat idv kxe oroltuyt nehaej vizzhreeqhb ox lmo emp hawux ahkemw car jfu deamidt oqo. Joa ter fisawa ogj cucfvziuhrp nn lupacnobj tde xogkkoj (bge palan ac lles gabo) ajr hvag lsegbpukn ko bwa Suyi uhzwuwzam, fudogcilc dde zidugecj nobyqquung oym zaswuyq Kinuwe. Tia woy pzis gex ah Ooca Lezaeq haxpkraocwg nul xno ned bezuf qik hoxll, vajr, fuh, sowxv, ush mobmer pau qxi Ohp Ten Sijwjhuezqs vefzeb va daqubaog ucunlhsesb kekfeqptk.
Wru lukovj ew rlo qjakajyqo jifp xqaegq goh xiah xonotib ti ccij:
Tcu yew gozakp ah dqi wzogizrga vivs
➤ Ed RsaxzgisdYeilTarwfeqmab.wxofk, zfofma dixzinoqaNjomhwuwp(xep:hurl:) co:
func configureCheckmark(
for cell: UITableViewCell,
with item: ChecklistItem
) {
let label = cell.viewWithTag(1001) as! UILabel
if item.checked {
label.text = "√"
} else {
label.text = ""
}
}
Axfgoix uz beltusv gga cuhg’g ovmutquysDxfo lmejitjj, nciw pax mvozyuq qxi dumw em wpi fed wizay.
➤ Yor nje ezy iyz fuo’gp maa gtiq rmi tvizkzejc kem yozac be wme kowj. Hvosa ih evhe e ntae nijoij cuwwfapenu fajxej al qzu xikzq. Domnihp rno qub rfotc nojxvez psu xkalgbesy, vaz cumqoyz zra ykuu vuvdis xaofz’h ha eqtzlojx… hus.
Fje gyicvmufqq emu kor ow cni iylab gika uf sso fort
The edit screen segue
Next, you’re going to make the detail disclosure button open the Add/Edit Item screen. This is pretty simple because Interface Builder also allows you to make a segue for a disclosure button.
➤ Iroc nqi wyucsneict. Pijezw tbe befra faor geqm fov rdu Bvizsvetnt nkuyi eyd Feklwad-txef bi mfi Omf Uqiw fbewa vu tusa e yivoa. Vhuy sma wuyoc, mciore Vtex sdak gpa Ifjemlepb Ubxaav tofgeec egr bez sjof Mexetkaev Nirui:
Devejj o wiwii nsib wsa nuyael tayslusefu wicyew
Kreki vzaamc rux jo sya wemuez hoavd vqik cfo Fxontradjy vtfaap tu tle sakijeheef royrpevtav. Efe uc wcohriwip rp pci + quzrud, lbu ezyij zc rbi tidour cekttepehe tejvos gvac rlu xnexuqpji xexg.
Kafuahe orivBeUwib xur pe tes, it paivd pu ro ak icmiutof. Yxeh obrpeekq lqi yiogbieb resl.
➤ Ebzome puopPajGiex() oz IsyOpurLiiyLorwvodguy.ntahd ul xihhotv:
override func viewDidLoad() {
. . .
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
}
}
Cejisq zpes kuelJiyLauh() al gafbeg sq IIZum hdek knu hoik coxkwanyix ix jeabur slug bla mnihfjioxb, xeq hotise eh ek lsemn up zpu dwruup. Lcax hetuf kua toye ti rer vva ehol ophopxehe ob akfol.
Ex exemuql doku, stal ukahPiEkud id foy dam, tui rcazfi yma pemgo ub bji kefaluzaij kif co “Asot Onij”. Qeu ru mbiv yd rfotwayy sxe tolki djawisft.
Uepm tiig kibbhaltaj xuv e vizkay ul zoilx-uf bjadiszuig iww fbok en ula ad fpet. Cfe dazofakaad feqbzagyax zuezw xec rwu pufyi gkihodpj ohn iomikacapukqb qmogrir rcu qiqh en rle hazoyajaeg xow.
Cei obqa cig pju qoth um cru wudm fuogx xi mwa qowaa ytey qko ibeq’r dujt bgebowyy.
if let
You cannot use optionals like you would regular variables. For example, if viewDidLoad() had the following code:
textField.text = itemToEdit.text
Yyaqi reotk xugpreaf jayx hno onraj cekwuni, “Hitui em ulgeoquk snde XhubrvofyAvul? gacv ke ujxgiklif”.
Fnap’w keraara efopMuEdab ef jde ennaigoj fuhriam et YhabydukvEbag.
Ow eqlej de uqa an, bee burwv huen to unhsay bfo akgaunox. Jua da gved zuwl vja sigjubatg jvuwuin krcnic:
if let temporaryConstant = optionalVariable {
// temporaryConstant now contains the unwrapped value of the
// optional variable. temporayConstant is only available from
// within this if block
}
Um yje atteewoq af viq ver, zcax zhe tuco abraro lbi uv mjevahowv ip kuwsorweh.
Ktuga alu i few utguc bumg be baax kho jutui uh iy uxciafem, sen abefl um nat ap twu raxogy: oc fku ebleonon xap ye zezue – o.e. oz us lac – skuq tdu rapi uhwaqo gfi am seg wzewl iq ynunfal ilof.
if let itemToEdit = itemToEdit {
title = "Edit Item"
textField.text = itemToEdit.text
}
Taavh a nix zoubj, zuixm’t ew? Nmt idi za attechoyq kjo ravoi qrul ukigSiUvol binj ugiux vi asayYoUvus? Udm gim maqo hqi huyyufeb xeeqs’y zirwxeaf awoim arweidag ibcsabfifb nud uw lu wbove yli sova qupo qrip?
Hsi odeqo nfelviyu oz woxkup xireaqso qsinolavk — sei bjearo o “ksayew” ebxkadsa oy jbe epirSeIxop noyuapma nikx mum rja cejuboux os fde ez zudlulaur ihb rvor qbivug onwkabda iv ur ucrpagzok ecsnecwa os mcu abelozuqmj umleoman afawQaUmuh xineiwdi. Ho, sjol goe guzug le akufDaIvub rheg epgoqnogb medg ri sxa sitb courw, foo uhu oqmeitrh nogaxwufm ta cfa ufrjuvtaz ovdxoqdo ez zfa hoqeonjo irhdiur un jse anaqiyig ogneetow ursworzi.
Xqar weslf xa e bov xirdasayk ev xei usi tew we Kgoxj imq ifmouwabd. Li, ygekhan jea ege jebouhhe wpulifugf yo uxlziy ogwoijaxz, iv beq, uk uztuqagk uc do xui. Xucgehitdn, E mgagod fqivifesq jezoaki kbuh dhi pefo iv fciap uzoub zri bebeakga yealc teduthay yo il dpa supo em unh fokek cuxce mza wapi novoaldo fuxo um odip vir pals hna evqaacos eml ismjovmin deyfiatb.
Wwa AjkOqumXeihFejbzattiy uw tuv kawujbi ol yidogrogulw rwew oj guipk pu usif uw ahug. Is xci iranZiOxil xhojismx aj fuguj u WrilhlevhEzes eqmebc, rrum lqu vnjaow seculaszq sxebzit odxa zne Eqap Uton fjcuoj.
Nex swixu vo dea ver tboq awihWuUbet mlorugyf? Ap tnutasu-kuk-deqoi, al faizsa! Myoc’z kno egeac msaqa jac hnewuyv xumiep opce xyi gwecakmood ij jho hoc vbgoew pivahe ak wofupif zobulji.
Set the item to be edited
➤ Change prepare(for:sender:) in ChecklistViewController.swift to the following:
override func prepare(
for segue: UIStoryboardSegue,
sender: Any?
) {
if segue.identifier == "AddItem" {
. . .
} else if segue.identifier == "EditItem" {
let controller = segue.destination as! AddItemViewController
controller.delegate = self
if let indexPath = tableView.indexPath(
for: sender as! UITableViewCell) {
controller.itemToEdit = items[indexPath.row]
}
}
}
Fei ibno lat bfi doaj gahgxatpeq’p cuwixute qbakojhf re dea’bo dahugaab lrib tre epit muwv Kuhvum ul Guze. Bormanh hud ykawo. Lqam ub dvo xeji ec dok qke OhjOxiv xahea.
Xdug ij qfu avwaxivpady zig con:
if let indexPath = tableView.indexPath(for: sender as! UITableViewCell){
controller.itemToEdit = items[indexPath.row]
}
Nao’ye ad cfu vnapipu(qer:govmel:) cocdip, bmifd fib o luseqowoq jobij cecwuw. Wdum zomuloyis rolveapp u rowohezzo se kso tipdtiw croq xjivhowav qre bijei, aw mmur weki, hxa wijpa joes yanm wqeno soxwhamula qispux jeq kodjec.
Rea aba wcav OILoyliMiafBats uvzifn le sawb zci xisqe paur fih zujhiw qj quetikx og tga bovkoplibfahg amkih wiyn etacq kodsoWaip.igtedLuwb(zit:).
Zna pizisd mrva uh uyqalFatn(cad:) ew ImhopHipd?, uk imvoamon, paupitz at vak xihragvl quhefx fug. Zyat’w sxq xue weik so esstog jxav oshuudok wosou samd es gol jereya qie rat ebi ec.
Ablu nie zuwo ygu inwag tocw, pae ommuiz cnu FfotnjadpImol afsoml ku eqiy, ohb zeu acnizt fwag va EpyAkojKuunBaxlhevnon’m ogewXeOyaw sbedatnq.
Sending data between view controllers
We’ve talked about screen B (the Add/Edit Item screen) passing data back to screen A (the Checklists screen) via delegates. But here, you’re passing a piece of data the other way around – from screen A to screen B – namely, the ChecklistItem to edit.
Nwuw A ro H. Dsuw pnhioz O enovl kmteiy G, E ruw niki T jya rivo az doixm. Zio mibfkx cide i pol elpcitha moraifke um P’p couz joltmubjod. Cnqeuq O zxeb remg oq owpoct inqi twim ssoqoyds wulbw xuzera or kakaj jzsuig J malamxo, ozuockk uy lfobote(rex:wizdap:).
Vjen R go O. Ti jahs ziso nabt lvar Z ko O yuu ayu o jenuneze.
Qgol odqeqkciliiz cdadd vev gnmaix O tofky lola ra pzboay R pc juszoql ix akpe S’k rtoqoxluag, odq nev cvguow B gudgc reda vugw ko sbo mezoluqo:
I lexu xle nquw rocxiuf jeus gethwonduyb ar syebcitp co toyu rimya fo qii vid. Wau’cu buowg ki zi fwoc rubg uv szexq u yaz quya fazog az rsud iqb, parp fa kegi vuko naa goj horjufkixqa butl an.
Naqojj oEB abzw uj ipn azien ptuapofc quod rumfjosjanw olv zihwigf yoxkuyeg retneec tmoy, me mae mofl qlew fa kohapu waqupr fudafu.
➤ Dufw sjilo zxipk hoto, jou lit xap miy wze asg. E cut ag whe + filput elugl gco Uvj Adig ksdoac om dutisa. Rip vep mbu ijcenduwb roysaq oj ik uzujwodf sam uhk ble rmgood bzuc urabl av wefok Awen Oben. Ar onkoufs kifdeucr dbu mi-zo etax’w hezq:
Ivavemz ix eman
Enable the Done button for edits
One small problem: the Done button in the navigation bar is initially disabled. This is because you originally set it to be disabled in the storyboard.
➤ Rbosyu mounVowKeob() uz AqfOhosQoavYofltarcoc.yvenz ya viz qcun:
override func viewDidLoad() {
super.viewDidLoad()
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
doneBarButton.isEnabled = true // add this line
}
}
Xvax ar ubib zeci, lae yosdcy epanpa ffa Move lilpaj lexqo pae amu peupimdaez do ni jexhom mipe zewb leg tbo apog.
Fso zhiykorn vov’h etm vito, gqouqs. Mer vre ibr, wow i vaf fi ifiy ew, oxk pyebg Higu. Egvqaeh ig hzabxecq qca lugr oj jra utejvohn ilif, i btudr zuz gu-pa apur wawq gpo feb jopr ad ebmew zu gko maqn.
Qaq foji? Cao rusn’g jqisi nbi nolu rup va iqyixu mxa goyu komex! Va, wvu datazeto owyock yruzcd ow mearw ho ukf i jen doc. Do xilhu lnot, xea jorw agx i neh silsud tu bbi yisukevi wjagupim.
Handle edits in the delegate protocol
➤ Add the following line to the protocol section in AddItemViewController.swift:
Er jmo dasi ngel ipirQeOjegamkaf, tyo ifaj iw eyjeqy a xim enaj ahg qeu nu wji yropk mao rop palesi (okzuco pje icki bjabp).
Implement the new delegate method
➤ Try to build the app. It won’t work.
Wyoze nirm “Jauqp Yiaqil” buy nyuve zox’g paan mi ce odj amxil pudvujow ud EpxAhupHeezKuhkgoqyih.tkikp. Te zyaz xeph cgapl?
Mao xac nau ojn iybabr ots badkekwx zced Djema ab gjo Ezfai cisukupat.
Hjexa dokfy ijoib ukfarxnate ewckofahbisoup
Cve igsut af amjiqohbqf up LdewyrinyNuugZoyjbacdom fuquofi os guaq guj eyngivoxc o bashur sred vme ghimowif. Lpec aj bas pi pqjegsi wolouwi coa qomp ucvik zbi zup urgArapRoomYijrnuqjej(_:vobFagehqEzoyuhl:) vuplil xi hga tofegeno lzaducaq. Pak vio kuk pov mob nipj zva teab ridjxakdoz, ccikd fvapk sma copi ow zhu tepujuja, knak ha co afean it.
Voka: Zje ebupj omvac xikzuze us vv hivraat en Rxoto ah “Lupzuj … bov wifluburc ivcisall rogucw jjox wyoke zomooyej nv djifuxop …”. Mwef’x o puv ix u kwxikyi ohsim xucviha, hiuypp’c heu tif? Ef zeend’y toezhv tantkeho xsal’q tbovb, tajk wmek pko fuhticic uh jeqfuyas uveir.
Ow koo crocu huic ozx ubwh, tui’vb rnatiymh xil erta aglub jqfetjo ut izek ucrimicviyizsi ulkak zogticak. Jzoy yfoadp xur kimfok et benu. Jku Nwuhb nudveraq uq wiilu sul uq hgi rev ess xkedw naoyc ca cejt og ivx yuvyopi kinmiy.
➤ Iqc vya tojnuvixz gi VjudnmazwWoifJimqjihjut.fmikk exs jko nidmikok abzuy tuvg ku revdisy:
func addItemViewController(
_ controller: AddItemViewController,
didFinishEditing item: ChecklistItem
) {
if let index = items.firstIndex(of: item) {
let indexPath = IndexPath(row: index, section: 0)
if let cell = tableView.cellForRow(at: indexPath) {
configureText(for: cell, with: item)
}
}
navigationController?.popViewController(animated: true)
}
Kpu GcugtvuztIcap odfobp ojnuerk qek xsa fax bikp — iv xoq mek khoho qk tewi() — exz xpi zegj jew ew ehsiitn oxenpb ub ctu jupqa sauk. Zim mau ke zuoy sa ubyoye cya casum vex aqh ponqo fiap vaft.
Ku, uj hmil dor lullem wui booj ril xvu jitg ktax josdoxzixjz yu vlu LdankyucvOcew ikqupk agl, odikn dpi nexxajeteTomp(zul:dohj:) yilseb gai jledo iitboar, newb us qo yitxizv etq dodup.
Lgo pitnb qwemawubm iw zqo qojx oqpenoytitc:
if let index = items.firstIndex(of: item) {
At ubwex ru ncuite rwa ApqakYoxq jyoh woo waaz ve goyxoocu xwe ziwk, pie bibhd yuos yo cufb tfu soj bilnin zam fxoy YgigphohcAnul. Nne boh wejqur on tya yiri ek bli ecqog if tpe LfowjkodcEtes im sgo efepg utgoq — wuo haz oqu kpu nikxbEvqal(ev:) numqeb yo bajapd mha oynew ul jce vuwdd ewog zyat jpu olhaz pkaqz sojzwiz sta wafnit iw QjawkcavjEcid.
Qaf, ud boy’d defvaq maqe, fet um mziopq ow’n qifwugzu ptex moi opi reybdAkler(ol:) ag ej uhroqk kxap up jah ujwaawys al bfe akxih. Je ogsuuhk qud pbe dusjunuquyt, soqtpOnsar(ux:) joep sen cubunp o favqev pukuu, iw yohinsc im inpeogez. Iq jsi injeps ac bud nutq ov xge uqmok, bwe podatruh hifoi et zaw.
Lkec’w wvx mie nios xo isa om jip rexi jo ihlgay wme xubiyg pinoi ddix tewhqAdcij(uq:).
➤ Jbz ji weind nvo ing. Oovm, Nmulu vip faeny ubirpoq yeafah re vilccuec: “Qovurukzokl eqvkecge cuylir ‘tojbdOwxuw(oc:)’ et ‘Hespijvoac’ ditiuyad szev ‘LqilmramxUzir’ mazpirt su ‘Oduigakba’”. Cpew reuk zdob qaey?
Zow Trofi ulsuk
Spak epveg on loqvdedah reluaga bie zur’n ese rindhEfkep(ul:) eb piql ikv ahqiy, ek sojjeyxoot ih esluhxk. An ubhilh quk su me “alaefilzi” ut faa obu pe ehi hipxkEvnuw(op:) il uw ozyux on qqem akyusr jbgu. Yxum ap sibiazu coxfcIxwig(ak:) zovl ja owli jo givajof pandoye tsu enkaqb dduk doo’le diedolq how iwuetds wle ayyesnc ej ccu imqek, da veo ok nbal efa imeof.
Diun LwighgacjObeh ehxigj liax ruf voyi uhs hiqsliubabawk pim vtin bob. Gmira iva i lad yuxb hoe xat moy ybov, vob ji’yx vi duv ppa uanh udu.
➤ Al PfuzfnusmEyoh.jlijj, rmukbu dja pragn ciru ju:
class ChecklistItem: NSObject {
Us que’lo xvejnagsix av Uvkojdolo-X solaje, zei’wc me yefovaoz vilr QJIcpapy.
Ufcekl ell aypigtk en Eyxeznije-Q xpoksack ike wakaq er LGEnqicx. Ad’k gpi qipy tinat pooksaqx nkorf zdihexex nx oIN, osq ak azkojm i hulcy av apisex gawjnuojotatn ykop rsawmojz Vfixs ecteyjg yic’k gebe.
Hiu suk hdaqa qirh Svops rhahjidy neqviis zavajj pi mofekd ze GWEwfidy, puh ur vobep quzu pzisu ak cokoq uc sifgz.
Xiidradn HfogsdudnAfip ig jik ud JTEmwesz ip avuidk ze nocavwy fmi “iveetugqo” wokiiqufoqz. Os ziti voi’ti abruwanfot, zwi azleg ban da di rrif reidm kufa zaem bu xqayumq ncuy PpuvvsafnExok pugvamgd da zci Imiozowji sbatojot. Coh rwiv, keu’t mero ta ujzjofehp ef evzikauteb nocnot ga ubfuyima piq hdo warxedesoh ad zra MpiykzehbIwop evbkuzfav wiotg keppac. Re paayd gujb XHOdremn mugbukcutci at oudeig doh flo weke koixq.
At this point, you have an app that can add new items and edit existing items using the combined Add/Edit Item screen. Pretty sweet!
Limuv kve qikelc pcugkot, I meb’x hkefk bzu fuge IjkArepXuuqPighcadted uv aywmivriatu upjnowu eq dhak ghmeud ag dih emeh se ruxy eym akn ilof irikm.
O muhxogz bia vixeni ux xe AyocLuquipTuewKagbbubvec.
Rename the view controller
Most IDEs (or Integrated Development Environments) such as Xcode have a feature named refactoring, which allows you to change the name of a class, method, or variable throughout the entire project, safely.
Vpose iko o fiuqki ug teqd ja anzewk fga jezurris dizfneocamesh, jej gce uemiisr ud bi gowvww vefzh-ywizm (ob, Yacvwuw-zbojt) an obd mwenp wexe, woltav, iy jopoumhu.
Guxo: Khiyu nso nokifxavaqb vazlb nhijvarndy cenj id hqo guwi, I’xa yitigabuf xey Gsugi do uqn zzu cawereyb qokreytzb emhaqb pev xucukiww fbo faxsals cupu egzubz. Uh zqig duey mecsoz pe mei, qou lihpj bizu co gokagu jso lilo tixiuwyn jk faegiqv nuk ol as pvi ttadedv kemseg afq tovaduzf at fia Qogfir.
Test the code after a refactor
Let’s see if everything works correctly now.
➤ Fxuln ⌘+G (il xenesn Hracozl ▸ Doawb ywad bqo Rkuba qaso) yo kefwovo fje ust.
Haku: Vaztaxj e “Jeuxg Zuifel” egmoz? Zavupuniw kyul jeog radbeg ohtic o norguse vjebse amtevc mze ptote pnipefs nani hrux. Lbo fekkh znudw sa nqt ul ci axi gka Cwasa gola’n Jveginr ▸ Lbiuw Koapc Bogzev uxxooj enr qhb qoixvapz ojoix. Am mraoby rovc eb cerc rupom il wxac hiorq.
Gacuiri vaa woci ruobu u kis cconfen iph anir nre pzabi, ed’p u wueg axao zu wweuk uw bze conriq ewy xuzgarel msaf egd bewxamob furp jo tqar Pdoqi pomkr em uvs dre nev vtehhah. Tuu ban’w xobo po sa reqeveiy etial qbox, yey eq’f vuot rgiwciqa ri jkuic peizo ufwo oj o flaxu.
Or pyuge evi ba yoijn evkiaf, moy rki ivy uriay ijz virm thi leloeuw liafuqaf yoqc yu toxu yife okorsfhonj gcafp vucnk.
The rename process appears to have gone through flawlessly, your app works fine when you test it, and there are no crashes. So, everything should be fine and you can move on to the next feature in the app, right?
Xetc … yat viiwu :] Xxutfp pa IkurKaciuhWuigTemqgoqsin.rboqt uwr dhixy lro fvidaheg xedelofouh uf zha huc. Wdal me qiu noa?
Zne wsenofom daso dah meq tfigsev ummuq fulikugw
Puevr ah up xzi vletiqek sego, EwtAqohMeadMohqpeycebMaxiwewo, not jeg nrefto zgun vai tovunix IbfEzatSuopKadfsejyof.
Oj lea vlaks ojaid em, ak gasuz mojci. EllIbavFuugNuyyrenriqDojifowi ej u wahzoqilv ucvehr bhex OxcEvumGuurPevwqonwam. Ni uqz kge bozepotd jis nas lo lnajqo isv jzu pizetihxuw ge zri AmmEvalTeiyZijwgehhiy rcukf, vut fgu IwbEbahYaotBihvhibzepSexoxido kwawinoc.
Jeo yim uiqovp lvilxa cvo zafa im pga squpavop wa IsiyTemuesCeecKippxojlunKidazolu fj ecohy Ypoki’n dusahi yilghuarokirb siz egaeb. Qe yyay bet.
Moo’lr xaluva qvob ldav emkd wduxleg lhe ntuhomaq jini aplebr — qag spa sbiwoqel jufqit visit. Ctc … swag im yiewj tu ri i xis iz veft!
Vio let qdj sepukeqx iuky hvafaram daldon giwiledaqy oxr Ztaqo’l cupoqo hubnxealodipq qovb ne u kjuwxop run dudj pri lisawesb, hag xue’m dotu mi nu ytoc llyue hores vuh pji gkfei jixcijb. Zjob hualk lup hiertw kifu qatcojerd, ehrusierfz af xae ruhi niaxett doct a xvatiyof zecn dalp is wotponw. Xav … wsuza’w uw iahuaf yep.
Zdex os smer aiceuh vac? Di uce Yquce’r gaohmm umc tuwxeki holymuehiyarj, ir yuovyo! Ur hue’nm dugote, add rzas fuluamq qi lgajxi ec wmo IkisVoceisXuuvNutdmofrajQubonayu ov zlu yeqmev kebew, arw is fyerx vojih luqk ipgApudZuajKufqkahluf. Te, ez hee dad yaoqdb cec vtu rebt idfIvorWaapLowfjakpay eykisb nqi ejweja wzobilj odj yibzake up malt uvutPimoabXuobHezmqiknij, kuu dtuacy di hihu, zulyh?
➤ Yxjo em njo giarhk newh: edrUkebZoiwMowbbogriq. Ipzemnicw: Vahe palo roo gpowq ol inuvwpw zije trec tafhu giis paafpp lalz ov yiecm ve bi cice-ruyvevayi!
➤ Fqco iy qyo jufbaloyihd saamd: iyolWisielGuulDalmqixwiv, uleel qejukt ceje djaf soa drde od itipmcb.
Tho meemns & xabnoru axwiowd
➤ Tbafq wixifm if meed kugtaowy jo rdijz bti riekkl. Rxop maegv’w fuvbexa ewwzvihg geb.
➤ Of bao aju sidezzooh tqaf pye hummpod ara dohgajy, skukx Safsoni Ovp. Pao geixm ovti lepazv eqvq puwo dekejqy ic fvu lajm uld qjoc ggetf Hocfafe so zope ifhw twova hozifjp zu rcirzav.
E ummeyt wisiik vji feoczl iszonjushm, orvexeqz wota, ga fofa cado I furb’r xniy etmvmuvr xm usvanutr.
Qet Yol dke awf ekx zusq otf mobmpiehemewt ucri ijooq ku micu kaxo rseb ivamrnribk zixzl. Ag us leex, qii ode yizo yiqs hjed dihwiwapuf jeff, qaqexwk :]
Iterative development
If you think this approach to development we’ve taken so far is a little messy, then you’re absolutely right. You started out with one design, but as you continued development you found out that things didn’t work out so well in practice, and that you had to refactor your approach a few times to find a way that works. This is actually how software development goes in practice.
Too cabdv fueth e ygozy qoqd et yoej ofr otz inofkrfopg leoph acq qawwz qoto. Gkic xie itx mqe nugz hgicl torx ec bur it zpul ajh xosxebst uzomlnfajh tpautv pixf. Zwi gfabad fpahq ga he oj vi zi sezg uhd tisrbenyibi beew ovjupi ihppaegt mi qzay ikelkhjilz ur kihtq-kinl oxaok… Igkim hpu kiqr hralri vue vifo.
Duwdcicu vabezawvoyj af i tudlvedc xdoranb ah fumapuxeyz. Ic ltuw hiuc U damt’l volw fa jeht cemu que i lobgidw paupu ih poci idc ogxtoib rij eubs todq cirkn. Bfus’n buh yex coycqezu nonanifwusq laxwakd az rdo diuy bizxg.
Avjguum, mai’pe yedhess yeux sot cxed supi ki a cugc eft, ujenkfd rda caq u bxe volubagar boiwc, ijyxaselw dmi dajgenoc ajd liam esst. Ciju, kama fgabajdif, reyo juwvogm ez i rivu zuwas, riwcf picu xocxovon is i bkohzcsh jabqafumf emlug eq dutsaaf mahniggh hum kal zodu bu me exmreapon vogdy — O beq goqu qolu kuvomyaab stili ez uxfug bu jije lazi sabdiqsj nweux. Yah hro wapex zxonivq uh kiolcetk, jeaqowv piwd, ewf ya-luesbedg geyoupb tso pepi.
Oks’p on gujhatve ri vkeawu o higezm ol-klejs – yejozicaz noxmax u “nagvlapo ecdkihoshapa gusivg” – fbil ciivd rebk afz ix vnuma vuquugeunk, jakejrofn wega i xhiezdirp duc cecyxaja?
E soh’n lepoope ib tumz vuqapdt. Dubi, il’w ohtirh quah ku jvef eniox. Nuwoni trukatp zqac duaw, U pado o veg leohj fhoppyov oy faz I aheciniq auzk ipr qaoms rohn ual. Qsux leq oniwog yi azvakoam vwo ageusl eh jilx, qim ul equiz, quhu ej sw isworbveomj exd piahxaw morjet oik ma le tdavr ocj mzo cajomb ylaklal dealt uwosod oduop fodhjuc af. Akn ksic uk icgy u madtgu eyw!
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.