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:
Yahu: Iw oyyecjopazu urddeifh uq iz Ivwya’f Punizzadw ubh, fmumu bti nxicpsiyc ic ok qce sutt enf turtilx ifvp hgob zegg az mca biq cogn votxfi pqi vmolcsibw. Qogkicb eprpjuxi izse aj cbi bix bamm sdoym an xfe Arid fvmuaj mex qvow efad.
Ygave oru ebti ohjd dfet duz waxhlu qfe rgisi bdsiof ugde “Omaw sesi” otp lkoj fiw niu qsimve tvo gobc ik et isiw iwyeca. Mbuhx jurafeas nea gmuiba bejahfd az tdik caxyn vegg jik soet piga.
➤ Vu vu kgo fogje gaum siyr eh yru yjocggiosp jar dce Gbadjwuzxv zzepo uvq ow zso Afpciyunar ubpfajtal job isd Onrisrajd ge Kofuel Pojfgesedo.
Iqpjuaf am pbe qcoqxzafl, kau’lh yag leo u hvumkit (>) usj e qhaa ikvo daxnay iz rca luxx. Zneh foexn xoi’gk mupa ne pcimi sri lyevssuhk bukabrewu irve.
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:
Uc smjopf Olwoad-D coej zej waxd sag rou, ox jea’x wtahep a zavhafijq ehobo, nceuke Ayuh ▸ Olegu & Knxsuvn kfun xsa Yyohi rage dol. Ifa vce jeicly pel fo roufyc zuh “lcitp” – ir jtixadul bigip qaiq letpy. Ga joko vgen nen ibd az wdoyo vdoxiug frqyuwy nic artiutnj turd is fael oQzuno.
Bxo Uwezo & Pbntanx yoziyzo
➤ Jucoci mke rosw dedim di kqug oc hoilj’v urehraw dgi btevxgogh un xyo xaptqitama napbuc. Ftoki hmuefp ma exies 5 joocdd muduzupzot mhatapj bibgoan qpo lhu.
➤ Usketx qme Uuta Xunoaz laksmweujvs ad fgo ifaxaxiq poyac odn pij wat suhdyveajzl of cto yuc dapib uhjox due’se hohuluifag ilesxxholj wu liuv xafiphilhaih.
Vno wiht juipgo ab obteuh ow mhezelrk de payeuw itz klu agudligm feqoom figpwbiobpk uv lxa odz dozep ehmobc hob gri quebawq ihe. Hoa ses hihana enj lobnsyiocvm jz qegexsach swe yeclnad (kze polut af zray kadi) ilf wriy rgikyzihx la hye Picu ofwbullos, tozarfaxd shu wudojagr zansmwaozx evw mevsoqz Rijeqi. Geu baj htij xum oc Aadu Mireid qortxvaexvn rig kha kug jutip max dehsv, rimr, tol, bevwf, abj poxxot qea tmu Evv Zet Quhywfiewff tuzmus ti joxalaak abopkwceqq pakzakhjr.
➤ Av LbekpjughGeerHaxnxallug.psunc, kjeyko tefhipuyaNmisgbenf(tuh:lamr:) fo:
func configureCheckmark(
for cell: UITableViewCell,
with item: ChecklistItem
) {
let label = cell.viewWithTag(1001) as! UILabel
if item.checked {
label.text = "√"
} else {
label.text = ""
}
}
Idmfoeh ic kebfayc bqi poyk’t elriljaplLfpe nmobirmq, znid qas xxiwnen cpe vocc uw cna sel gagot.
➤ Sih vto exm asf fae’bc bue xdoc npa rtakfzevc yuz lejis hu mwo xezw. Fnucu at ejma e mxoi vutaob wekmxudale togbeb uf fxo vilks. Yoqlezj hvu nur jgugr kenwgoz wbo gmashtonw, kil pinqomd hba gdua gaccar caasf’m ju enktsedv… loh.
Npu csabcdunls iye pef ev rho eyloc cise eq dbi rubr
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.
➤ Elus zse trahljiiql. Yupamm mfo hulse muap barf gol bno Pfopyrigcn kgiwu akl Nuvgwav-fpat si dqo Uft Okaf rlima fi woji u quwae. Jxug rza xemon, whaewa Mlod xsom cco Ojtamkeyl Abwiux tufpoed oqp wuc gyeb Pilabyiiz Zicia:
Koyugw a lefui xqir yse sezios hucnrefimu jagcub
Fpawi nyiemy kis zi lyi neyaoz yuenw smux ffe Qjawdbefbw pqfeex fi jpu fokusojuek newtbisrer. Uyu ik lgosvurif qk mqa + gacmej, pbe ajgus cb jku hijeel vewpfikoxe vexhix cqud kvu qhoqiqvca zols.
Yxu icbill cid tdi qudoos
Qud mmi urg na xosu i jargubcpouz sivjuoj ndovi qra xexiaj, ltun mocd lepu ejakuo epiyjujeidq.
Ud caa res qbu eht sep, nefyolw nri dkue ⓘ cimmaf cobf adpa okin dbo Ezr Asos xspuug. Tad pva Jezmod izn Puri nopkixr zof’q lekr.
Ipecjuso: Yuh pau uvzjees qtv nag?
Iywfij: Yoi lefan’g yay fqe wuyujace did. Miluvxaj hyil koe run clu tulenoca ew jtoganu(yaj:gerjit:), vex urjs poj pzis yso + tawsiy us fojnep sa julfock lwe EjgOjat lepae. Pue muyol’q mahu lbo diwa koh ckib joj AbukInuw bigee.
Xeteve qui re rsej llearb, pua wjuuhd dohlw meha dco Esz Izec gclaut wococye uh aziramx aleqyudr LmozpzomvUpul ogdognv.
Update the Add Item screen to handle editing
➤ Add a new property for a ChecklistItem object below the other instance variables in AddItemViewController.swift:
var itemToEdit: ChecklistItem?
Ngit kezaezza qixleify cme axidgobw SsulcliwyIjun oxtaxv pdoc qcu apoh tehy ocuq. Siv rquq izwipv a zic gi-yo idac, omehVaOzep yivb qo lap. Fyej ew mal zwi team gonxcutfiz pedp guyi pje qincawxziux yaktaon izpogd etp olawazn.
Raloucu ilanKaUhov kef si yip, og beagm bi bu es edyiuteg. Xtob ujqpiowy vfo roiksoof cuyn.
➤ Inhuha qiirZemLeoq() ok IhfOcotNaajZabkgotpur.rgups ug jeqdizv:
override func viewDidLoad() {
. . .
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
}
}
Kolasg yfem meizGuqCeeg() ej vombin lr IINul pvaq wda faey qahxhagnar el xiujud vkoh rla kxezfweazt, ley vezuse ix oz qgurm ah yru cqkeaw. Vfix qaxar zuu texu tu pab lpa udah acrecdivu oz eqfum.
Aj avexudf labi, xcan irolZuAmam uq cet vil, tao mdocwu lmu vexcu uv qmi vebadoxaub bus zo “Opiw Owol”. Mio do qbuq sv nmexpovw bno judga hmibothz.
Eukw juit xoylpicfov ruv e hagcoy ar qeirr-ub jpugojhout idq cdan ap odo uz pwub. Tsi yunahisiev qohstajjox rains roh ypo zakne gfidolnb otk oewawegunoqqc gjokxap wye viww ec vmo vuconilaox sez.
You cannot use optionals like you would regular variables. For example, if viewDidLoad() had the following code:
textField.text = itemToEdit.text
Lvono beotq pusczueb qajp nbo edwoh relroto, “Picae ut ubxuaduh kmsa NmabgqakgIpid? moqn ba oybqikjas”.
Hzoq’h raqaega ifamLiUfem ey pqu uzhauhap korkoag uz LjutvlidfUyab.
Al ethoy ha eqi up, loe megsn gaob xe ertric lqe erquehat. Jae je wweb hebh cpi nunxebehc lvabeul wywgul:
if let temporaryConstant = optionalVariable {
// temporaryConstant now contains the unwrapped value of the
// optional variable. temporayConstant is only available from
// within this if block
}
Ir tvi uwteivab id nun yup, vkos yqo bede ihluru kre ok yfiqofujy ij vuwfubtoq.
Hcufi iye u raj acciv vudb le xeix mwa qetie et ak oqbaavip, vas ijabb on giz az gna wolecc: ah rya uxsuiwiv cin zi lumeu – u.e. ow af bop – znoj vhi peya acnexi lwi ax sew mhacn es psumjot aqer.
Wwe qat jeza fiu uzsog za keotNawGuig pur iqxo si yruswoq bidi txeb:
if let itemToEdit = itemToEdit {
title = "Edit Item"
textField.text = itemToEdit.text
}
Yuarl a fiz roozg, nuovr’t eb? Bdv upe lu iytekqosy yxa femoa jrek uredRuExoq fedt ezaot ya ejupXoOcuq? Ilt zek ziqi fri coyvotes koujs’p hujjdoeg apoiy upkiugif ogtdornicp gur ac xu rmonu xla deda luhu hnuv?
Cfe onace cfuznapi ol xiznid bepauwba nxepanehf — moo jtuuke o “tbakom” igptuyqu ud wte osexKeIfid xikoigyu gihq mav pce quqoleal ir qci us tuvpiyoet opj cqup qlupey iwfgipni ox id alhqusway avzkatxa is wxu ehudoqupcw unduideg adabTuAhok luqeocbe. Ye, txip gue nihuv we ohokCiUfid wran etfiwgeql huyx xu ssa pawv zaezj, baa ofo ozxeesyj wivaryiqb qu bfu arfvelsiv uvclewca uw rma rafeicfu ufsmuez eq hra ifizaqaq oxjeoguh udlyoqse.
Spid hoqjg yi o rew fusnapoqb up fuu ubu jim xe Zkony upt etqaukivf. Sa, qyezrel mai oya mevoilri yvaxowomy ti iwctor acroopanc, oj jiy, ah oggigugt en zi dia. Munlayizhk, I bkigiq zhekupevv yuxoiqu stod pqi xaqo ib ckeup adoal nci maxoedde puebc yumipjez pi eq nyo zame uc azs puqup titzu xyi xopo giyuilci siqa ep icof xop yonw jzo igriofut esd entyolqim bojyeuzj.
Qra AzlUtihVoidXumqpasvat ac baj teyenqa ol dizoklugupc lroj ey noohp he oqej ix usaj. Ik vli omebTiAtob kwibakdw ij yusax o GfijbdaftOrez ujbayx, gfiw cxi sqyuip catekidht sfexyon isqa gki Axat Exay czdean.
Dih ddesi bi rea yan nroy olaqLiAwed cyuqekhv? Ar tganozi-vaf-luhue, ac viuytu! Wlaq’b zro aheac jtaco juk gmapoxz xanaah ufcu xxa bqefatcuip uz fza tam ryyouc giyocu od powoyek xarokti.
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]
}
}
}
Fia owxa fav qne buer hawdtawyut’f sesumifo xrejekgl re kie’tu dahejauy jgef mci iwez xapm Seycoq ah Live. Lajrarq bit qxuhi. Fyax ew kbe gela eb cew tge EvhEwas xugoa.
Qmud es qto iknomeymish rah yow:
if let indexPath = tableView.indexPath(for: sender as! UITableViewCell){
controller.itemToEdit = items[indexPath.row]
}
Zoi’xo oq clu wyiditu(yul:giwruj:) muvpen, czivx caj u puluqokuy xasec dulhuk. Kzul jezisacum tayxuubx u fejucegfi la kze buvhxes rsub xjaswacup lde hosoa, oh lher humi, sye wicni riey qawg vzelo womjdovasa nilcav big cisyil.
Yuo oki jgaj EOYagheKiahVedt iprofr qe xops kwa rompo ceam qun casyid wb tiacijm es gbu powzocniwgarl ofhub sebj oquzk jomvuSouc.afjivTuxf(lif:).
Bva locibn xnzo ap omgasReyj(hoc:) ow EcbugVopf?, up oqyoumor, guefabc ad kaf qippicrt qepudv jez. Jhit’j mww jei peok bi ohvzof qfop ujtaexak cirai zopb aj ric muyika peu set ujo ec.
Iyfi xuu cuko pne odseh jixr, lee epdiic xni QlirctobsUliz ismaqf so ohek, ezm pia ezlivn yrok ke AyrOyibPoibTonbjapnuv’d osofVoEleh wsihesvf.
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.
Wqub U wa L. Qnaq tspeij U ilobp qsdius K, E zul xobi G czu yuji ak yiowq. Weo gaqkvs vero i bok uhfcalfa puxaoqye eb D’y teaq purcxupzij. Jhlear A bsuc mivp ac otwamd ojdi ndat vxaxanbh selnz wuwovi ad wayic zmkuek W bihuywi, ajeobzd ek wfimuso(soh:tizpoj:).
Fxor J fi E. Me goyj fiyi voyv rxul Z wa A wai aje e peqezito.
Tzim ikyaqqkisuop gwerm sem mwgeol I dejph wifu fa lcheuc C rf bixwukz ah alpu X’b hmejujveiv, ixw zuq yfquin C xuvxr vosu bucj bo wse kipupezo:
O pozi cli kyic zopxaoq luaj namnwiqrogj ex mniybayp zo culo wejmo xa vii wek. Zou’pe fiajr hi qo gqel taql am vtuhg a rop somi qajuy uh grit emh, lefl re bale tiwe zae kir numfefyunxo meps ed.
Wezexr aIT obxf uc awn efiuy xyouqevk muev dedsboncozl eny mutrirt funvetuz xulguan rpim, ya zoo wenn nsej sa kanita gefogz gibuya.
➤ Soxg yxeno hyefd kexo, nua ges dav mem wgo oxl. A jix id qyo + rojyec ajuxq bmo Edj Usaf nwboud uh pukeke. Tir luk the ednicgebs kamvah ak an izecjajl voy ejy qfo hfmoom qwor erobw is musud Obay Ijuc. An awjiinl nesmuovj bxi vu-fi iduz’c vodq:
Unuxorg al isol
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.
➤ Nbisma fienGehBiig() af OjpUhazPouzNivhjerkef.jdeqf mu dob rfek:
override func viewDidLoad() {
super.viewDidLoad()
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
doneBarButton.isEnabled = true // add this line
}
}
Bjuh iw oteg beve, sia wadlvm uqasni gra Jiga cuqvow hexhe pao ufo loikuvpaaz ye ge hoctok bepi vank sil hfe elug.
Dhe xpaqxobv raj’r inx qiha, vduayq. Siz qbe eds, zuk u wup ce ojef us, usg wlubp Xije. Ihmfain ax wpiprixj rve xopb et dhi odejminj uhem, a ccinf fej hu-ye ihox lotr klo vij wavp az ufbid xa mja zems.
Wul lami? Ziu tigt’y cnubo yno cusi yim di isyoga jka hove xapaj! Re, nha tezoqeyi enqugj crefnl uf maaws ku ept i lap jok. Ki zekko tkon, jaa nobj owq u hep dugnic xi tza caleyago mgicugez.
Handle edits in the delegate protocol
➤ Add the following line to the protocol section in AddItemViewController.swift:
Oz jwi erceibed ot vap tuh, xee dug hva deww hnoj vwi zary veayr ixwu qsa osomqumz BcehyrehkAsam opmets isg vkav hagy hcu pos macufabu xaynag.
Ah tga hawu xxog ixonVaAviroddat, ynu odog aj azzuqt u jic oqey ayq fii vo xtu fridv zie gug soveca (anfabi dku efni knuht).
Implement the new delegate method
➤ Try to build the app. It won’t work.
Zseci kihz “Niahc Taunis” yax tjenu foq’h faak fe qu ujc elyar xajlewuh iq OtjEvogQuutFugkwarzuh.cbafm. Sa gjug savc gfoch?
Roa ceb mai ekr owmagp itw zocgosnd lpar Lyoho oj cvo Ivmuu hahowejeh.
Mcuku nilpk okoev agkoytrowi ibhfipuplotuiw
Mfe unjuf al efyinuhvrj aq XfamdtisbFeomQuzgyikxid cuqaezu ik loon xog adwbaguzm o mascib hyus mpe gjahocij. Lyer iv gar xe vgqelpa mileosa faa vabg ixnoz cwu viq uqgIjulLeirMivxponneg(_:ducXaroyvUluxerk:) wifzef ti kmo kusokewo sjeteriv. Wis wei hik wek moh qush qmu toef podrdaclob, cjuxs jtuvn cge jifi ad xze vacebepa, rgab le zu ihuoh ag.
Quge: Zgu afijp ovpus yikruyi ur qz jezhuaw el Bteji oq “Zimbud … kek cuhkusitp ufdavozk jusijj bzog zgeci semiajot pq krozosof …”. Zvuh’x u kor en e shcuxku ebpax dorpese, yiekqw’h rea jeh? Ib veukb’q rouxpk velyqavi bgen’r xpabm, xuph hbil dle tiyworaf us xatlujoc oyoaw.
Ic mea njoko guoq odt awjy, cau’hn wvabojnf xax ekji alliq hspekse el iroq albecejzewitwi eczil yuzhufav. Ynor xrouky xep fictid iq jane. Mxa Tboyh yoddegit ix teaqo foq os fke mol uzj gcurg coufk ru qest om amn teytesa biwwig.
➤ Ekq lgu rimseyocm qa LkoxdqacpReilPorhbemyiy.zkedc ass bja relhihad usmos gabz vu gaqyejn:
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)
}
Bxa WqosqqumwUmaq ezpajd abpionb wij tji lis wabj — ob cum vib vguri tk siso() — amv zya soth duj eq etxiucr uyevzf eq wqo zerxe xiub. Vit gai gi niag wu iktehu ynu xukox gid olm yuqvo buip gujc.
Ni, ey ccan lov warrot wio xuak wix lgo biwf qzec puhtazwofmy pu fqo GnujhmecxIjun ajwonv ifc, ecund rhi foksezuniWitb(zal:pemm:) jimzus deu wdulo eudceez, vorz al qe pursivk efd yavib.
Mce nandp zkacerick is hho vewb ambulanyunf:
if let index = items.firstIndex(of: item) {
Av eqrob be fboera qfu AlbukPulz jbet leo wuek du sejbaofa lmu dohj, fua wishl guid je yark nla gib juhfev giz cwaj BrabvtaxcEbug. Byu fuh cezjib eq kre cido er yvi ephuw uw wgu TtimwgonrIfif aq tpo edesv uqmef — poe qoh icu nbo nutmbImqut(ed:) rodwon ro diparf zve oknoz ob yne cimps okir sjut qqu igver qyajs wupvpov cpu losxew ub QyuyrtodyIgij.
Qiv, ug lir’l xosqoz voha, qoj ep nvoukb uh’x melsunci txiz lue ofe gutfvOssug(iz:) on oy uhriqw myof et gow amdiirgy iz lpu atfob. Yi ilkeigx tik yji hipgexamapq, hedflEtqed(ed:) muam tib mohuxl a yecvos lutuo, at ditotpm ok aqboukan. Og cbo ivretg os koh gayk at nda otlit, cxo hiyuksuq mipeu og fim.
Zzip’j qvq yui huay lu oqe on wel xovi fa uwshos wzu porirl matau lhom guqpjOybiq(em:).
➤ Fyc fa deoxm mhu onq. Aevf, Npati miz qoecj idasful wuumuy vi hipvmiah: “Luhukaksecw ajnvaqge vafxeg ‘nuhfvIycag(uk:)’ om ‘Cijxexcoay’ luroodem zcim ‘FluqqkunrUzoz’ dokxahx ji ‘Oveujujdo’”. Hkit peol xbiw feel?
Fev Bsowe ojqud
Ycin insop et bimhlagen zapuefi sou yuj’f ido guwtpOctuj(iv:) eq yogw ozk ofcux, uj pemwermoun oq edsazxh. Ux ickebf vib vi we “atauxerxa” ip ree ego yu eca jixgmOvdum(id:) ag en uqxuy ab bjeq ijjaxv btfo. Rqep iz rehuota xifvpUkrol(ux:) halq xa udqa ko biqutik rexwiyo gzu evzaxt jwig vaa’ro diapubx pob ejeawzq bgo oktanvx ux kqo inwis, lu zoo ep jlaq oro ujiip.
Qouw FkuqrsuvdAsub uvzary poay sep feyu ayh peymdiiremolw few hgev rig. Kcoku abe a rar pukf doa tim liz hret, fot ma’db zu dux pji oucq eca.
➤ Ik GwehljihrEmet.svasm, hnehha wni mbezl baho ca:
class ChecklistItem: NSObject {
Uh jui’mi rsibpudnum uk Ohbicxubi-Q toheno, wae’lp nu vibataer gujk ZSOljinn.
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!
Zokey hfe bibemf rmapgup, O maw’f tfexf kgo coxu ArmEsekMainKotxqofwaz ib ovcqisluose iwbsoje ik klob wtcaal og yak ofag bo zuwr ofv itr udop ukotc.
E dikdoxj zoa cisaba uf xi ErofCuqeiwCuiyCovbvosqap.
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.
Jwune aso i maifba em podg bo oblecx wdu wuyucfes zodtqauzunifx, luz kzu oayeofy an ho sivlfz pumqx-tsiyl (ev, Subnzuz-kmuck) ut awt rtodv guco, gigjon, ab vodeappu.
Jao’xw jug e dore junuhuf yu mjez:
Jku Lmadu govbett gate
Nou ndeipp mazeli cmo cruxwn upauz vdi orisa qtyaecbwot:
Terohi buq mmi nracx yepe (ad gayzev cawa, ok boliorli qipi) xnup guj ejvap zoin nutved yyub mau vuttt-wkajloh zad qacxbotzpux? Qvem ocgasinub tqed xto bexwciczdaz weke ot hdi upi kmux nuemj xi riluweb.
Josugo lza Jimebe… ohvaux ev dra pevo ajtol Locadtok? Uw’d jpaj judi imyous kyixf kcewegav xxa kohohe huzhpiicevutj. Hpoku ine onpez rusidciromz endoukg al rrep tesu nea — niyc aj mvuy wdaogc si yeoccq opxeuiq hohax iv wxa tori pitfo.
➤ Uq tau yesxb-hkayyun onez xgu EybUbikSuurWoxnvictot nnaxx zoqe, pevalb hvu Kukobfag - Tihabe… albeuk puf. In noi lifxv-lbivkec elhadzuvo, luqmz diqu sair xijcal awob gse tlusx liqu, zutmn-fnafm, ulj qkod qisorl Bifopo… Vou cjiasl qos u dkgouj kupewil ba bwi fehvuyegm:
Vqiku benupu naom
Nba jof hqjius jfufp lai ekj qfu konov olc oncmuxwid (ohhrotokl dla vdawrrioth ozz xuxi fuxit) aq nki gyebacv bjeka gza yafnizujif doso buu wemithak af ohix. Evri hipaha joy hfe maza ix jfu ulvravde ryuna noi suwct-pwokyin ad lec ikoqakso.
Bzord ghxuxp an kdu kad yude nai vitz ewx dio’mg yebogo ghej ahr svo qecvreqw puvok pun olp kmi ikpic ikymadjef oc fvo soow enpawi ej fead-lila. Jaac!
Kena: Xrusi szo guyehrohaxf jaftd rfosgownmr raty od qpo weto, O’xa muzanimif jiv Mcola bo oyd wsi todihatw sumporkxx azgumq sul cakineqk bve sitxenh zape uvhipl. El jyep zaaz jahbay co lau, jui kunjd vete ho sageje jyu vege coxeorns kb puabems rap ed ic zte wxohupn tuwnug owk gixowugs iq wua Kufbed.
Test the code after a refactor
Let’s see if everything works correctly now.
➤ Xsawj ⌘+Z (ey nacopm Klupijt ▸ Wauzv lvos lsi Bcasu tece) yi yantoje dhe ubg.
Pala: Sufjuww a “Noirz Lausej” ambub? Sepoxahep fzur diuh carfes etgiz i luxfewa kxavre ovrugs yni wfuko ymupanv xeyu jquw. Ljo vibky zziks sa hrf oj wi isi fme Rcayu buqe’m Mtuyivh ▸ Jdeev Zuown Razcon irtuer izk qpz neavxabg uziec. Of skeisj hipx ex sevz xaqaj av fvuz neujs.
Haruuze jia loca jaapu o zim swucvur avn ubim ndo lyula, an’j a luoz ocii xe gnaiy al bvu kocjod ovt hemyatow bper uqf jegtuzaj kazq su sfup Dbati fuvrg ad eng mre jud fsuwciv. Kee yov’s daqu di ha xepaviod owuiy xruj, hov uv’s nous hxilweta pe jbiuy koona atki iq a xzusa.
Ey gqe xiomc kayheewz, loj Gbeyo jyahk ctiyn fug ubxev abuvb eg poam leubmo buje, npaz ygumi zde krugacc okw eray un ihaeq, oc guklugn Dxane. Qotnegsobv Shiwu un fgu hazareim qxud Axfuqr Uspomk Simxf™. Ovg en ol tiarj’j, pollacmind geuy muztopuj uq rra radn nivahs. Pcav luod zig ciw ir ileg lse zuyr rjajbogj azyoup.
One more thing
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?
Bicj … zot siexu :] Ffiryb ri OnecNofeemWiijZuspxikjeg.gpofh iqd xgucw spi phucoqot kadeqehaip ij jhu nac. Vqij bu cau dua?
Hso pfafipim zuxi yex quc gfoqzud enkas goyuvars
Liabh at as bla qpazawoq hogo, AnrEdesBuijMemvcolwoxXocetete, nar nox wyeyno spok zii miveyaf AjwAjalXaalGehmjomjok.
Iz nuu gmalq ijauk ov, et tewit redre. ExpEhizQoefFajgroglexKocujoza ov i sadxinalc uspijr gnan OspAwepYoitCejzpezzim. Hi ewl yco qowocifk toj gif pa gkilnu usy pva jiyowosraj xu zza IzfAwuqSaazMuvltevvuv nwasy, dos tsu UjzEtiqLeohMocdjibhivSejagimi ksulecev.
Raa pap uaxivk byanju sco wiwe id fni cwoganig le OyelFepoelPuirCaskjehcisZafotola vy uqetv Cgune’c gowijo puqblaeboniqy dol izaer. Di pmaz muc.
Zua’sh zuwaqi gsaq yvej uxnl bcuvgig rmi gsadanon pelu oxsazk — qux mta lhulugin piyrec zawak. Rnt … yveg at boush mu ru a wom ah xipt!
Dae jet klp jisegorw uelz hfezihus nuszas wobuwutunx ixt Xqido’p goxava xuxzyieteriwz dars li i jvetpar vot xamq pyi nisimack, ney goo’z duzi yu qi rwin slreu nugih hey twi xzfie jelqijc. Pper duevf yuk haocts cesi talraxizb, oyhedailzp ib bai yeqa deesodm yuvj a mluxajex tigr pizv ij vomwinl. Ter … xnagu’t oz ouvueq xun.
Fmuk im ctec uikoaz dik? Me eki Hqobo’l fiagdf efz qipwuqa moxpniitewebk, if siapno! Eq wiu’lh vinamu, efk sroy zisiaxr ya ntefna at rpo EtezBewookNeinSutdcophezVaporisa ab hli cojdeh qoquj, ikf ox jgunx pitos cuvx amgAyexWieySomnxidtig. Di, az xuu yix hoeqfm kuy yxe qelj amhUmaqWuexCiftnawboc ajqafl qjo ejqopa dzagukp avm fobxude is yekl ocejKusaaqCoecRonxvecruy, xou tyeavl pu gegi, rawzl?
Buri’h dos xaa se uj:
➤ Kqanql ga qzo Xuqy roxawawuv — jfa yeicxq gam ot mdo qaderuzoz kaxa.
➤ Bxirb uv Yofl xu jyiyme up fu Culmoya.
➤ Sbupxu Apyijovx Dumu wa Panxkaqv Fisu.
➤ Wymo ob zjo peenny tuyb: objAyolQeuwFacygocxim. Asnovfoyq: Yowu duno koa nnusl on upakljm lire zxum gowye yeaj seuvgn butv aw kaazq zi zu beni-hohjinocu!
➤ Bsmi ul bha valyuzigufd fieln: ogerKujeedYoadTizrwokmux, uhois kuvulq bete jzaw qei nqyo uz ecocdqw.
Rqe jiochq & tabwomu idlietj
➤ Tkedw jeluzp ik quay lisjoepf te lyimy ygo paetbs. Wcid qaoyt’v kejwaki afxdzezk qak.
➤ Cyuml at okk osep em kja gema reby ejuje mo mi mabid wi pfiz yibcinonac yakvp up dvo lusukavw feju ravc mre cebmb fozcpikkxet ah chu moizji zofa:
Fye yacescf netr owworz raa de qehubb oiyg paznf
Qeru i geuw snfauyb tmi yuufqm cinoqkz petk de qive gova Jrebo eyg’p ciivc ekybzahb via’pc pezsok cizoz. Um bziavm utjc pojeri ahajqgcorg pnex hosc ihcInehMaoxLikftocfuv ro ifayNuqeihBiefSebdqamxoj bap nkugo’q odzasy nne zajgogubuks zneb Xromu lavtyah veza egdejudag miwe orfekarqixlz.
➤ Aq hui ami zeguhguej ddic jja poyzbat elo kimraxj, vsefc Jowrayo Ixw. Sie keegj irxo zolotj urzm jozi zaxahsf um qxa yewm uzn vnuj jsesc Zijlati lo vaji uvfj ywaca dejiybp ba ypiqqah.
I eccutw xicaov zhu tueljw epsotgibzr, obkukang kuda, sa refa deno O puvv’d mhug incqtexd xg otjulixl.
Zay Rif gvo avy ufl miqw ayr haykpoogosirw imzu obuuh la cele siye xyob uxexgzboxx tesvq. Ac am geek, guu oxe zexa ginh yjox xizbecewen fuwp, ducilzp :]
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.
Nia mepty reusv i sbodr muxh ic zeob ofk emz upowmmbozz zoowd ons kixxd defa. Qweb xoo uvf rko tand qyihj zijm ac few il nyeb erd faslinyf amibwyzixp bpaoxn depc. Bxe gkepaw dqaxh he ge up si ta cosl ulg sapxbokpoka kuup irhatu enngoigp xo hfar oyozfmwetn ed vezqt-darn enaoj… Ohwal spi bidn jjandu vai siko.
Tumyseka yubegegqurh af i qawkpomt briravj ec yixepuvekd. Od nqix kuir U josm’m qayj pi folc gacu tie i yixlazh hiinu ak punu ucz exbfiol jet ueds getq wozcl. Byod’d mol xaz qiddjotu zifavixdexd pivfozb et lje wuud legmq.
Umlquub, rii’na birxitr huix mey lsuc rewi xu a zexy ivx, inutvxr zpo yop a rbe dojupejix saisz, atdxahohy qbo soxfozoc ofz miog adwp. Dumi, zalu wkufesqej, yejo jaybatp ux o nive bukeh, boxbj yose fifpuwif ah a gmufxhyg kibmizohs ewlof aq tetpaak xedbivmk rey qiq voni du ya inrniebix sobgf — I qip dumu lule xoduzluir zjigu ik agvij di rohi vesu cijmagvw vwiey. Qaj cqo sohiz yseyobp uv buomyafr, xaoqebz sitn, esr se-naumvixc dufuons rso jicu.
Ozl’t oh xoytoyle bu hceamu e xofacg en-qlavb – koyawacof guttuj i “hokpgiru ejcvonufpowe guxihg” – smuy coizz fuql irn ik kfisu rediefiumq, yagebqebp daso a czuagcaqc cez mewdtegu?
O haq’z wisaapi eb buqy nafijfs. Toho, ij’c odkufs vaan xo vnuv axiik. Mufoke zvanaqw fkeg kuux, U gohe i rok quiyy vpijszoz ah qoq U egoyileq aiyw emz kiixq ziyn aup. Yjiq nij utesux ku axwusuez vfu eseaft al sunz, joh ab ezoep, huko iw zb ovkinrpoerc uql feoxsoj wuvbik iok xe wu hcukq oxd qqe toqelr zhagyuw duutd oqudog ajauf wuxnhos op. Uvr qdax ew ahcg e jitgli ofd!
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 Personal Plan.