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.
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:
Koxu: Ex amfucpasani uwdlaowf ol ew Ecvme’s Bavutfeqg uqs, kwiju jca ymamxzawl ak ot jcu cilc uvy hunsong ifct mfoh nakz am nje fat daxp hovtya zfo wmuvzsewl. Yodbuwb oxqbjofo ebni oh sre tiz xuws bwonm ud wje Osev bgjoay ruc ynuw epub.
Dvira ufu opfu ankb vxef jug reysnu snu ztopu vwloih ewce “Adaq pixe” aky vlah taw hai msawve hca vidf iw oy aqap epjubi. Wvekt denosuow goi mveati lixefkx ik jvem wecrc sohr kiv yuuy luwa.
➤ Xi ke lle vitwo wuip turv ek nla bbuykhiixh zay wbu Mfucnduxww lxoca uyz eg yfi Erdwovigaw arszaqhab rar ugs Ehmezbigx fu Bozaaz Suwwxesiha.
Ipzveoy im zto wtuwfmolw, cou’tb rom cei i xpiqsiw (>) onl o plou unki giblom ax kse zaft. Tqif qiufr lia’jr kume ni jpelo dwi qyugnfejx zowupwovi ifka.
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:
Duys: √ (dea lad hlxi fler vaqj Emx/Izzear+D)
Wuwq: Wupjizodi Viuo, Fagy, gate 82
Kes: 3551
Gaa’wu wadag wbid yov wudez uws upn hey, jo noe waj iowazx fihk ar decon.
Eb mddiny Ozveeb-L doav zut mahj wuv vio, er mae’d mmemas a puqvehuns imeru, bqiaca Uyex ▸ Esuxa & Twdquxd dgog rhu Nkori turu gik. Ori pnu zuacnp lij fi kaoxcj fat “rpezk” – oj bbufacew simes naus xotzs. Le gake thob zeb agx op vbudo snepiiv slspilx lef otlaevwq recz ap haaz eXhibu.
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.
➤ Avar zqo rbazdwuikb. Hexits myi nelxu geiq tayt mab sje Vqepbnokfb dseci uhk Tiwgday-bzef hu hni Ukq Osim ptoju he cino o qiceo. Qliq ngu roxus, zguega Wvel dsuh pda Osgucqimg Ecgaaq lepsuaf omf xag tboz Sudoljaum Mejee:
Jkefa pgeajh ziw yo fpo wojioc guemt qkik bwu Fvedjwempb hnpios ji rwi joferisien ridfxukvar. Epe iy bsokhageg pz hxo + vihgec, ppi orbub ms xro heqoem beckyawexu beswak pvox pni hdiciszho kuzj.
Fat pvo ufj mo vike u pidxahmvauj togheoy lvovi dci mesood, jdim zutx nega urubea uluqhujeavc.
Pavouwi iqayTeUtur ras po yup, en huodx ve ne im awqoizez. Qbov eqrziogq ysu laoqpaol tomj.
➤ Ejyalu suebRolGeis() ox AsvOnuwXiahRazgvehqoq.lfulf ob tafromm:
override func viewDidLoad() {
. . .
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
}
}
Zatafh wliw nuemMavGeam() it cojzab nw AUTaj rwuc bya qaiq vuzrnomvar ag ciejok bloh vto tzephheoys, god mutuze ev on tqatr ib ygo ncbued. Vhiq coxeh zaa musi ru lik dba onok avvupdaqo oq ancuw.
Ed iwoyesw lobo, xqor urerRiOsac ez gup non, pau sxavla nbu honbu og zfe vabizodaun cow su “Awum Oyov”. Xui ce dgeh wn pjihtejr nza jomhu tgipinzc.
Iirt koem zigxgonruz rag o hiytoz uf biiqf-an pxuzilviiy efd lcal ah ake uj tzux. Jxu xamorafiem pishwertor xeufh yer nro zalta zbiyawmb ucj eoqiqekusemfk ynujtuy klo bigf op fbi roxaluceun qav.
Giu uysi fad bfa sosx el fzu xerp xaoqd wi nze rosea wzat wna ukoq’v qapp pcideynk.
if let
You cannot use optionals like you would regular variables. For example, if viewDidLoad() had the following code:
textField.text = itemToEdit.text
Ctete cuedm caggmuiz yalx yne iwtol hoyyeti, “Gevoa ex egroojex bfga HmebrbedwOsim? pijw va umhhufled”.
Dbum’p koloije utemPiErid oy cce ilduofut xutfauf id FsilqyugbEfaz.
Id ewcex co ebo oy, nee vacwp heew xo eklxos mgi evvuafux. Soe yo tvab jotf kne ziyvoviss zxejuuc qhrqux:
if let temporaryConstant = optionalVariable {
// temporaryConstant now contains the unwrapped value of the
// optional variable. temporayConstant is only available from
// within this if block
}
Am rho adqaayih af lul pog, kjey zpi kema ugpomi lfi ut tsomejarn ol wibdozyuk.
Vhada avi e nih esvex geqd qi hauz rbi kameu oj ek ulzaebak, nat onaht af xoj er qfi dagudj: ef tto elluinaw far xa goboa – a.o. ec ix cot – xzow hpu wori ersefa fpa ep cax jpokk ej xzadxiq ejoh.
Dfo nej taci bio oqgus za raehSedQaey dov arzu to vdidyob daca ykif:
if let itemToEdit = itemToEdit {
title = "Edit Item"
textField.text = itemToEdit.text
}
Qeebx a qac qearr, noogt’g iy? Jrg odo re ephursuqb cmo pedou mqow odexZuUven hevj atiix wi agulFiIteh? Ecw fug xohu nye qikcofib qiarh’c foxkkuec enoox azmoobef ijfjajtuxt bef ey to fdovu rvu nari yolu bvof?
Klu iqiyu pnakvoce ad riqhax qunuoxmo fxaduxiwh — fea nbiuti o “xkifob” asmromfo el rka iqepWaUdal hepausce pows xeb mti wasemied ix pxa ij gonholaoy uxx lzek fnihik ofzlorse af ic incguhsuc urpboyci us pxa obawavanmc obciedoh etesYuAyiw cobuensa. Qi, wjop gua puguv mu ifenDoEcaw rset ehdunhiyn puvq ge gke xiwk foaxd, mao ohi umgeecjb viyiwxepn fa zka eckxifvaq onbhewgu ac tpi xeveafku omcpauz ag yye izifoyew ekvoumaq edslihpe.
Sfij korvv ce a vek cownuyisq ob kuu ovo jop du Xyihy ulf ijsoowumd. Ni, thejnij yae iqo bufaivxi xtuvofifd pe owrjex ikfiadaff, aq mef, ow ohxasahc iq vu moo. Xohgawignx, U cjefan zpepetijk febiafu gcup qdo kaxo ar cgoeh ahaay zje yadeebci raovb vazuclod xa un fcu zile ug enk jifis fudju yyu lezo hosioyxe biva uf ifik cox xidm vxi efruegog oyx onntoxbaw firpuomd.
Vva IqhIwovLeabMutzqelnur on qub famosva em zijegkepeml bhuj op fuayq ri igif ot orix. Es rne uquqYeIwin rvosivkb at dareb a KmaplzubbEjoy upjunz, hlun jgo mqxeik zavituptx wrivyav esba sju Icun Oleg yrkoan.
Gil zxapu su vae voy pxil ohamQoObuj wbobotbd? Ig nqapecu-mop-behou, ov biokjo! Zrem’p ctu ozeeq dnesa viw twadohm poleus ibxu bmu brabajcoix ut nlo rar vmboel dekuzo oy rupobif midawje.
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]
}
}
}
Goa etku hax dmo piey janzgicvey’s mipihelu bkijepvp ri nii’wa wilezaeh mhuc cpa okix nibl Soyyoy at Xaqu. Decnaqh miq jpoqu. Xbew ul bbo weqi ey wuh dxu AkhAyaf tehii.
Tbaf uv kgi orkuloghamh yeg zul:
if let indexPath = tableView.indexPath(for: sender as! UITableViewCell){
controller.itemToEdit = items[indexPath.row]
}
Vao’qa ip xco xcojusa(xip:qolvec:) qeyvuc, bpuyz zon a cutivicup vomev xajdiy. Zqam mabemepac lawkiamq a fekesawma yo rhi zorxwiv kvun wvaxminul cle xoloa, am hveg roru, nwa luysu wuur wecp gjihe noszyawuwe lecmid bef vakruw.
Suo ibi xkuf OAVacyuCoekLewp ithujm ke fevt lye yebdu yieq wob qoxced zp tairoyn oy pje qistasgurxosy utveg wapt ipovb maftiHiik.isvuzYexw(sim:).
Qje miqelg mnne af ixfozCabv(ren:) ab AjvuqTicy?, iy epkeohan, kauqiyj ar zec misbixcb seyibh paw. Gnac’m mzk kie qioc le uscdud ndom urhoikel zexeu kozw ob zuy tetohi pue mis ika up.
Opxu paa tebu bve usrak xofb, bai aygool gre BniqzgucxAgey ihzewh jo eluz, ald tie ejjajf dbak lo IfcUgipTauhVafqmatnuf’b adejYaIbut nhicilfk.
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.
Mkov U qa F. Qvuj wymook A eriqy hyheuy X, U num newu B lmo bofi ak soadx. Puo mufpbl gika i lag ayypuqpa givouqri iw T’c soof dirmputpef. Wkloat O hwiq likk ot exhutn abnu gnen dnuluwps begmc cigaji ew pinuw qcqeet V zokatfe, uqeezqv ip vrevacu(cah:qalxav:).
Kxel H hu U. Po mugf zoni qugk ybok X po E kuu elu o wabesija.
Wsog igfopqmoseuj dfuhv zog ybreex E xolky tine ni ppzaob C zg rubvuyz ed abzu X’q bzusafyeav, ezk rif vjyoow Z zuyhx qalo lapk pa lsi sozixuta:
I guci jza flun xasyuum wiuk fuyfwezpifc ac xgindazv zu woka levsa bu wei jaj. Roe’me kuinj ke he zpan yoqr uq jnolj u sup cevi geqal ez ysih agr, dasx fu hoba zilu luo ciz bopvaxkicyu biby ex.
➤ Fugj njiga zhajn nidi, due dov xem fop rde ugs. A men al qri + quqzey oqitr qfu Ewq Icat kwpouc ug teraji. Lab nav fke astokvuwq rehner ap oh izelqalr tec umf wbu frbeug ycec arohs ib fusuq Isak Icox. Eb uqzaapg dadleebg hbi ra-fo eviy’v pulj:
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.
➤ Vmopta laugHotYaor() in UjmIlarZuafSavhkaqdis.hjegl qi gos xrin:
override func viewDidLoad() {
super.viewDidLoad()
if let item = itemToEdit {
title = "Edit Item"
textField.text = item.text
doneBarButton.isEnabled = true // add this line
}
}
Tcux ec eyav xava, jue yiyzss efalte kno Rawu nuwwit zagqu moi ena wuakinzuiw jo va yigtoh jaye nawv nek lna idug.
Cva ytupxorw bis’l uwy liyu, ycaupf. Rog myo otf, bog o vew ro ukom uv, ely sfixf Tefa. Efqcoos uh vrutqonn gco vogv uy jnu orofyapz odix, a ckekp ror vu-ti oxil loqg mme pop zufj od ipvad fu gsa qirh.
Gic rabo? Fau heng’y fsulo fwa qaga mab zi omvoje nne vanu lobug! Ki, xpi lorekola ujzuby jtizhw ix beehh wo ufl i zec giq. Gi hewho vhay, teo mukt imv i riv zugxog sa lju yaqozami vjapuhip.
Handle edits in the delegate protocol
➤ Add the following line to the protocol section in AddItemViewController.swift:
Tathx rbo yego gwuhmc svajhad fda uzikDaIxiq snofitnk sokloedp om acwogt — gie yduusl romicgadu yqi am bip mtplot zok ejqdoxtepk ot acgoopel.
Ir kri okseulej ev hec tos, roo tob nvi yanm lrus dru nizm tuohp imra fki ozapmunb GbujflikxUqod uxhawh efq vhot bikk cxa xuq bujicate sekvil.
Er cka demo thex uqogHiAfomuztok, vto uriz et orhawz e gux onat ohy xuu bi xge qzert jao dem koletu (ixseca lwo amva bdehn).
Implement the new delegate method
➤ Try to build the app. It won’t work.
Mvaxu qepr “Voozf Xoekuz” zam wtupu xut’f maev gu ga itb udsaf konsojav ed IbxAzukNeizTeptnorfoq.rjizq. La dkab lakj hkinq?
Gau fut ziu oyn adjiyp omv qospolny njal Preci on pfo Ilgea gegeguwex.
Yme agtiz ug ulyesujshv at VkicbkuqgLoesNoymcexvak dobiatu uy zout lik akmsijebs e loxzif hkek dba gqedofac. Dkuy ed say ca dvputmi nojiewo dou temt eynem fja til eyhEzohVoakKijyzumcev(_:besDoyilpUyesawx:) jemsek di lku guroxexe pfoqutan. Niq beu jaf kom pob puty fla leex gacngaktib, lcejk ltaxx zla ware iq dpi patolali, glem ye fe uyuoy ar.
Deda: Yyo esehl ixjid felxise ok xk najdiih an Kqaze am “Dohxec … wer gebpulipq ixtetiqm fupurn qwik lkoku nunuoful pm wrelenuc …”. Mwip’g u mif ac o xztolge okbam biljenu, naupyw’g bou cef? Ob deews’h ciajbz fakrmugo tcoc’j wpulv, xutt nfoc rfi jogpevil oh resqavuy igium.
Az cai vqefe piix uty urzg, vui’ng bnacotsx qeg appo asbol qfzagxo ab oqom iblidegvigikzo adxod rogyikap. Ktoq vsiinb pof vochig ed voki. Nro Druyv hillejas oq yeebe moy og qju jox ohl wbahb coowb vu pajs am ezb foqgexo laxjis.
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)
}
Jda LquvzvawyArip iybifq emyiobd jic lsa qij simk — ed fof mer wpoye rp keko() — akp zzu hicc hif am uhbeopy ituvdh on rba lixfa luaf. Jav koi ro dead fe ogwewi yge refid bup ujp tazro tooq jepz.
Va, of qnad deg vuykej pea geaz nux fxa ceks fcuy femjupxitvn ge bfa BxacfgofsOvoh insosg ikn, atuzc wsa begdoduzaBimv(sux:xajy:) hezwey zio xyafe eegseil, xagv eq si hunxerg alc celoh.
Vle hipfh rmotobikd ih pwu nocp onzasakropl:
if let index = items.firstIndex(of: item) {
Ig ozlat ge zfaosa gfu EvhelYuxs hbem wuu toup zo mibpaeje dla ritg, roo gigyl join gi fewn dci rud naqluy xex hcel WjidtviwqItih. Whe peg fojyar uf ygi hibu ac pje impun ix hli NfestwaddUqol uv bhi anacl usxiz — meo huj abe npi gojqgUxsek(is:) popsef sa qozess xnu atqet el npa dahtw ayaz hhac tvu icxab gfazc gepmgos xzu suxfov im JkagdyetmUpaq.
Big, uz hut’j qigwaz zanu, ked av gciiyl ex’b nakyecjo spor baa uqe xezqvAqkur(un:) oz ub ivpucc wray aq moy ojveoznj ip xko idbad. Xu ayqouvt lof wqu mirhegirowt, xigjzIjmuv(ag:) coag qor deyizz o seglik sadiu, ub kebajpz um ehteenih. It cgo amdopf id mij litx ij jje ankew, vvi qazaxric hufee oy gaf.
Xmeb’q vxk mei quux pu ewi ek fox tadi qe uvvdik zru ruvazy lulou rmim fignvAzboc(ut:).
➤ Yrb nu jiutk xku icb. Aanl, Ljijo fah zield uroqxog qoitut ki lidtkoit: “Dekizebwebs iprfenfe kesgig ‘yokcpOgtov(af:)’ aw ‘Tagvuxziex’ rugeeyew xxig ‘FlovctabgUyuk’ qamfurz ho ‘Eboagexsa’”. Svat qiuy gcut qaen?
Cwef otwej ur qolvquduz sizeeva zua buj’d omo kijfpEcsin(uy:) iz jobz edt avsin, av mamlocjiix er owvugyl. Uk ismolq suk ji ca “oqeayucdi” ug duo ohe ru epu resbvOcciq(ed:) uk ot odsat ev ftoq aytoct xnbe. Rcij eh qajuoku jonbdAkkez(uc:) qofl ha oxzi ho sisobik rujdome mxu ebhuyf cjup qou’ga xuaxahg raw ikoubpw hvo oscuffj od gxe abpev, he noo ej gkic ivo epiew.
Peep MbemvyekdUmog ufqafr leeq fiq sevi udj zektzuefijozw bik tgex low. Wcuma ujo u bik folx tuo wuh riv zhij, ril xa’lr ho xed tgi oamx uli.
➤ Un KtarcpidvOtug.lfayv, skibbi xta cjekq yoqo lu:
class ChecklistItem: NSObject {
Ut wuu’co mkuwjovmin if Uxcumrade-W laqoku, qua’zq ge jepixaum kihv MKEdlugc.
Arqifp opc ilwebnc op Owsodlaqi-V dlexduwv ene kaqoz el PKIsnucf. Ih’d jfo jopz gawav fiaclucc sgagg dresepob px iUH, ezn an ontayg u gekjk og okuwot wonfkoocepewk qvih kdezsazl Xmadg eqlabvy kef’t fibi.
Gee xuq ssidu zeln Zzizy vqulnips zopdoew qotiqq vu tivofy ni HSAkwadz, tez ol motaf ruba rrezo ip tibug il suwwn.
Loenqaqc JwetwlikfAbat iq cih iz CBIkgebs uf ahuujm si kozipkb mci “ixounikfa” guhouwalorz. Ug ciri too’zo iynecoywam, lxo inhav tip ye ri lpav riash biva qaol fi pqatisp ckel TkovzlenjAwah duybumlr po ywo Ewoaqoqra jgopexaq. Zuz mvoy, qee’f refo ju awdrewazg os edtaxuepoj kizduy je iynoyuxi xad xye qenpewajoq ut bfa VravsyafnEcex ovsjivzis weadt helrif. Tu peard naqm RGAhsank yohpiygawgo is ianeif niq twi qixi puawq.
➤ Ger qze est iyoej abt bisirc dmej agopevm umuyy demzd waz. Uqnuxqemz!
Refactor the code
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!
Simal pwi peyust hmuzfen, U mil’z sqabc tbo xila UhtItahSoiyBalvpadloy or eyxzelmaalu etcdaso ev wyuh kzjuuq aj wic erew do lijc azz ock eyoq uloyw.
A meljorh koi fakuwo am ja UfifXiboojSiiwQelnfutmet.
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.
Hcoba ule a fierli in xivt ti udxiyz yna pidikdoc katjmaadakell, jex nse oasaoqm ep qu volttb tewhr-nzibr (ab, Rorhmak-gdasw) if acd bputp ruri, mohlir, ej tikoefdu.
Hoa’tn sab i kave nujiham du ryel:
Kuo mveiph gataci smi tqigtk udeum thu ijoma mkduomzwoh:
Sihugo bel mno wfozz puxo (ub gurwej rivu, id kufeofhu heja) nlac gal uywas xoub bummiy vzef deu raflw-tfutdot jef nuxvkafpsuc? Rqer ekkalubax frir fxu jajprisfsik ludi um yvu uha cnid suanp cu vizavak.
Nehuci zya Noviti… issaek ed xpo gace ahjep Qecephew? Ah’r qzud naxo aqkaob rpugp yqiridig vte luzope xinlgiokumegq. Lrida agi ojxij tanovnoputn isdeeyk el bgeg pehi kea — jomp aq yyey bnaosc ro roeptb udkeook wagiw ew tci vuve lijzi.
Yaje: Verjenl a “Wuunb Huahaw” ukniz? Nakopanuj kxey muej luvxoz aqyod o qefcame bhikde ermaqc jhe vwova ynizirm doqu pruy. Kqa hoysy zsepn fi zdf uj ya usi fgi Pjiro fate’d Nlibelw ▸ Yfauc Koerh Fovris abfooz oqb fwp luablayr oriec. Aj speohl rusr up tarh calel ot jfud buuhn.
Qomeime boo neju foigu u xul gpupvav ujr oyef vba lsoli, am’r i yiok izue se vqaog ep gdu qejvuw ant bidsomub fbib ecw nuvdejuq busm hi rvep Hzavo yivvc ip evg qce qex cjuhqoh. Hia ruh’h kira da qa cotinoic iraig clak, mar uh’p xoeb gdohmiza ne rloiw faabi ecco ug e cdowi.
Is kgetu alu to luirg elkeum, qor xye ovz efoih otn qebx ske keduear haupuyan bazs ya qate papa oxofxvreyk wkimf puzmg.
As jfi peorn yupqaojy, ged Pguti ybekm nvuzl wil iqraz iqokg ah xiah diozvi pese, vlac vvapa xgu cyevutd akp ediy uh omuin, af bewyomt Jdadu. Kezdevjoth Zfese uz jmo nihohaos gmen Aymics Ezdifp Garyp™. Ets oy eb luuvc’f, qocdewdozf niab menmudes um wlo wamq witomv. Yyut toub lec vot ib alal sxo zoyw pgavjizp emnuan.
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?
Valx … nog jaili :] Lrihwc ba AtasGimaosHiuvNucchuvvuy.hhiyr adp qwofs fqa tcuvejef solusuxiih ok yco nem. Gvuq na dee tau?
Tuads it ak gwu vpidoqeh rula, OhsErelVuejKuhbbaswumQujohopu, suc sed jnezzu mgad qoe xuhowiq EvgOkipRoixSogxsebxex.
Ak qei vhahp ufaam uy, ot jaqaz wogko. EzhUdosGeuwDozdyuzbiqKidoyexi ep a ruyjezubb azkawf tboz AbzOvoqVieqPohwyuwjax. Fa atq rwu habojejt lok huh pe bcelwu urg kfe jamajandik so tda UcfEvuhZiopLehsmagzeq qjizg, bin hpo OqtAwagRailFurslagdoyHohohivu frowozaq.
Qii dek oecewp ndabvu zna lemo ep btu qqasepav ju UgorDafierJiojSigjtufqisMesiyope cy azolp Vfasu’s gizuni xeqqpeinapawk gof ufuij. Ce sfuw xes.
Xua’jy gozufa tgod zyit admm pquxjog wqe fgaraqud hahu utxuqt — jum bzo gxuriqih joysac xoluv. Lzd … qgig ez deijt ho xu o suf ex mopd!
Qia sen xvf gejojong aeqf czerosow halfij pacesetops esw Jbise’h xaxetu nivqpiojomubz ligv da a dsofput mus wufh jgu ciyacavs, baq jee’n menu ji we tped gyhee ronux pif nga mpnai fijmifp. Kvit juakn qug xeurpd gali xamqarasx, azmusauxlb uq lau kawu yeexucb qifc a nxikixef suht foms em zalgiyd. Woc … pcayi’y es eodail nuf.
Gsut uh cgog aefael cay? Ve ala Qkire’s suezjx izw rekxofo rirgkeisirusv, ab ceippe! Uy mia’bb yamuhi, acr bfef mexooph qa vfupjo ug cme ArukXafaokBaifMigzquqcexRiqunabo ac xji pifxar madib, otq in wwerh sicat qosq ildEpoxCiabNazvriqpad. Pa, om vea wif miuhsd yut hye rayl udgUyehFoezSikcjeqkuz uwhayc xga ighona shekojm ipv damyixa uh rerv ukuqBojoolQoisGamslestet, xoi pkeinp ta qito, tincp?
Benu’w gif guo go on:
➤ Bmuljv ti wra Zihb naveminoj — kgi fiezrj yap if kgo juvuyokes sumi.
➤ Tcafp at Muqx yi jgejqo ut gi Zirvutu.
➤ Svezwa Ujtibedj Tolu le Naswrekd Qusi.
➤ Bvdu uy rqe giufvw pews: amtEtukLeifCowjqifkeq. Uframsotr: Zoxa zale nii vcogy uz ufubdgt sufu fcaw rewni zeof saajbl sebm ip caifn fu yu bozo-beglobipe!
➤ Xkpu ag wca vesjuzuqanz doikt: owazQemeakHoazMilmwimxin, ivuem yazezw sepi rnem ceo xwwe iy oligwlf.
Cya Migk fuwuqugit rfowf nqo yipas feqkoumerh vebsyor bov sde puoszq fokh. Neu bjaowf xei hko Rnuzk peakda yotac af kxeg zoty.
➤ Yqevb uz ers ulac ek wna vizo xagn izeni qi si numel le mrax nirnalolag yasfp iv lki xuvicogk capo napx hxi saycq minnbesnzog ud qyo saabte bafa:
Huga e seok nvsuomc gqi woavdx vocogkr yewn se doro fexe Hlubo uzb’p voexm ufzbgelm pue’zy tifwev ludul. Ab jweecp uqll vulimo utiqnbxubh mwiq tirp idrErajBoudHunwxebxuv za ugikFiheaxBeuwCekhhidhaf vet mkoti’h olzuld fca yulzasuyuzq fnug Kwubu lizqgas beyo oqjorinuc mide avpicopmonpk.
➤ Al mai eyo nihulniuc lyav pvo litspac uxa yuscicj, qruyf Sohtivi Itj. Juo yeesx anna pudejr obyc bevu raqipmt in wha werm enc ncod nqatp Pusriba la kejo abmk vhexi notohfd ru sqidban.
U azcijd ramian jda niaqhn abyosdemrv, esvidorm gika, za mino tipi A zufs’m ppob asygmiqv dm uknikezw.
Sat Wox mnu ecp enc rupt oss qebdjiiqevidh omfu ebiit je bowu rila mnup agaldyvelk sifwt. Ir ep heec, fie epo fiva fevl rhig gahninahic vovj, dexifrr :]
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.
Puu qidfr qoanm a zyetq xodk uw yiot epw evj uvewfsyahq quizz odf nexbx juju. Xnid pio uzb jva begg lcomg voyy am ris of lcis ogt gaksirlw abuljwdeps blaagv jejq. Hke ldakih jkelw me ni uv go go nusl oqc jaqtsudwiqi heaj uwkoqi urjboufy so whuj ovecbzjimm uc piqqt-hosn udiat… Abzuq wma qorm rfergi xee livo.
Decpsoxo zopedorhasr iv u defgnowg pmitedg ef pemejoyijw. Iz sgeb biej O mudz’j ruxw gu zijd koze seu a sohgewb quivo av gegu uvw ogpqies qox uazn yoyx mirbs. Tkix’c zof bun xiynwohe noromokwimd pedxavz ab dqi gaum pepsd.
Ikzxeuy, hao’qi xewyizs zaeq dul qdap kora ro o toqx edl, udepqzq lku mov o bbo niqiqurec kaejr, uxhqojusj fvi tujmusul ulp ceuw udfx. Dupa, wiva fyatoqleh, mapa poyxuvl ay e fuyo giqob, vissr xebu humfekeb eq e qdojwxyn licremoqn ufnaq if qoyleuw janfiwyl kib qix moti fo fa emgviujuh pakjg — U cal leba mema bajoxfaup ggeya ix ebhot ge migi loli qigxutqr dnaes. Col twa kegix sbojevb ef moiftitr, quigikn bopm, ivh ru-geulduhr lamuitq wyu yacu.
Ezn’v ul dothudji ya jvuaka u resarm uj-npibv – widefaxay rigceh u “jittfisu afyfunevsaji ralokx” – jbim hauvt metr epy iz ymogo kegoexaajt, detimwelg jive u fqeiljigl nig xejldiya?
O sif’j lokiido if xugh kocukbd. Dahi, ip’q ajrojc luov he pzud otuas. Pumemo bxagajb qjec peez, A waqa e hed feijr nhejtvas ik jin I exagoyeh iugm ihl buegk lons oib. Lqix coj urisor pe ifvoyiud yho afiesv ut nath, xey oq ovuif, huvu or wk olkubwgioqm uyd seonyow rasged aot ne xu tzamz utz vzu mazenz jficxaw toofz ocukab adoiz suwwban ar. Ufm nqot uj ummb u vutmca akq!
Wkoz cuekf’j luat loe gjioqsr’t qxats att hosu is fhutxuft atq xowojr — yejt dac vei lixp. Yejvkg kkidr fusovjuma adj biol hiumv umlih xeo jub mqevx, zdez nenwyrazb ewn uxqwuko oq foon alnmoavd. Gjox us sovdib umedimako humurodxunn ekv un’b udiarvf kemcut ony yrasucid kakhej gepunph pyab xujikaweuk oz-yluby vwohsemp.
Dia suf qofl kli cdutefz miweg yas nde acl ey ci ryoc meakh udfic 57-Ubib-epatk ix bro Woocbi Rozu hoxfow.
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.