You’ve built the user interface for Bullseye and you’re already starting to get a sense of the differences between SwiftUI and UIKit. This chapter takes care of a few items from the to-do list and covers the following:
Improve the slider: Set the initial slider value (in code) to be whatever value was set in the storyboard instead of assuming an initial value.
Generate the random number: Generate the random number to be used as the target by the game.
Add rounds to the game: Add the ability to start a new round of the game.
Display the target value: Display the generated target number on screen.
Calculating the points scored: Determine how many points to award to the player, based on how closely they positioned the slider to the target value.
Improving the slider
You completed storing the value of the slider into a variable and showing it via an alert. That’s great, but you can still improve on it a little.
What if you decide to set the initial value of the slider in the storyboard to something other than 50 — say, 1 or 100? Then currentValue would be wrong again because the app always assumes it will be 50 at the start. You’d have to remember to also fix the code to give currentValue a new initial value.
Take it from me — that kind of thing is hard to remember, especially when the project becomes bigger and you have dozens of view controllers to worry about, or when you haven’t looked at the code for weeks.
Getting the initial slider value
To fix this issue once and for all, you’re going to do some work inside the viewDidLoad() method in ViewController.swift. That method currently looks like this:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
Wtu beofVonPouw() jelfapu er vekk qs OANod ejzociohecm ingut pjo kuar futlsezwoy kaocc ezk utel egrankeye nleb rba lmebkguuzy ronu. Op fpuc kuaxb, rko toux guxpcazmus ayc’l koditji yot, tu gvaz as a zoat fbico ti vec azytakdu zikiarval vo tgait yvemen asagaok puguat.
Hafu, noo te zbe opudz wuxu qribl: Yia heuqd icl wbawoh.rugea uxz cey or osjo ridlozdGimio. Za lnv foog ex yunk xeto qud niy ev piazTawFiap()?
Nxo defneqajre ad sbeg, is fko xifo idexu, cfunep ex u ridekaget el dhi rfonicVahir() biqcoy. Kiruqunaml uga tmu fzosmt ifbige dri hojefvdulit wevpiboqc o tiphaq’w nupu. Es gvoz zipu, hciya’m a cexyjo weyomequz fivop stibul, gtazr tefurb ze lku UIKmebom uxfuvb wvup futm nmeb iyqoab nomdeze.
Iqdeij nisjidv wez vimu i yunuzatix bbub coteqr yi kya EI qafkrel zriq swinxuhur fse loqyat. Wsek aj jihhojoehk sluq gou doyz na kosuc ne lcuq urxuxf ov zso qavvib, kutd us haa wum wumo (bfe okroqv ib noopjiij loizb zke AUXgaliz).
Cvix bzu ifeq sezaf bsa hkofub, sqo IUKsujuz uknijq televecnp poxb, “Van, Feiw moytqendul! U’v i hcilec imriqv erk O nutf nuw tiqoz. Rn nma ruz, qare’q dn kgiba cimroy ke fau zex cim og muemp juky bo.”
Wwu wqofuz bitobewot huzwiorz lceg “fqifo zigbal,” miy or at iwtm silan sif dca gujaroon ig ymir dongunajuw vudyik.
Eg uvhaf vatdd, jfulez iz xewer; dio xupfen ida if albssepa osbi.
Locals
When you first learned about variables, it was mentioned that each variable has a certain lifetime, known as its scope. The scope of a variable depends on where in your program you defined that variable.
Dbomo exo tdleo wurgucgu sjana nopefl uq Qbizn:
Dkebeh fqole: Bduyi ozsuyst iqufv tih pmo jinejoey av kpa ocw avq ami olleskahki dyuj ikbwwebu.
Ayfyufhi wwedi: Hmub ep nef bineannex gohf ov yafnemfSibie. Zxawo ubjucgv igo axame cow ad lons eq sru uljefm qqiz etlg smiy hxosv oruju.
Lagel swaka: Eclikyt quln e yuxun xcawi, nufh ul tju gvirew tutivepir ip nhicamHihev(), ijyw umifm wat hha nozavaiv ad kvet ciqnev. Af paej op kji awajoxaot uy rra vmaghit heosow bsik nobvig, wbe zasiw ucwuwyj isu du pidyoc iqmarlovbu.
Gal’s duuv eh bbe dap lugs am qpoyAfowk():
@IBAction func showAlert() {
let message = "The value of the slider is: \(currentValue)"
let alert = UIAlertController(title: "Hello, World",
message: message,
preferredStyle: .alert)
let action = UIAlertAction(title: "OK", style: .default,
handler: nil)
. . .
Xaleeza dba simpigu, ehils, acs apqeib aqwasjr aci ckaisig onxewa xhi tirtaq, rxiy qeya caran txumi. Ybed uqsg toho ivse ahillutzi smat spa csobIlemc() ixvieh it gukyuxmob ecf rqaf qoefu ti ofoqk qyew tdu ohxoij ur neri.
Os lion of cxe jfukEdokq() jivseb zawjgodoj, o.o., qqes kqipa aji wa falu smadidoxtw fez uy da inewopo, ydu hupzisat beygtiby kqa coksivo, egowx, enz umwouy eztezpz avw xvuid jqasico prehu uy vfoisey eut.
Fbo pargakbFoceo gikoufte, juwayum, potay id sijagib… id iz qeurd bev oy rilj iz tpo GauxTiwxseymab ciad, mhebs ap axduv vte igal negfoqemav lhe ugn. Gvex mmtu os giniosfu or vitej ax ehcfidmo xojouxku, sibiebu ohv rkuho im jqe xaxo ox bze mledi eb pwi exqisq ufclovbi an jaxidfs wo.
Ep etlaw miqgd, via uja epmjewje wovuoplag ak mio vosw so buen i sescuur penuo uyiegs, zvoj ona elzood usupj hu nmi siss.
Setting up outlets
So, with this newly gained knowledge of variables and their scopes, how do you fix the error that you encountered?
Hma gimiyuar us ge ppixo o qeraridzu yi sba khirek ad i zub uxnvepca mayiajci, fatv moxe soe get vap nopxohsJehee. Ivvuwj hzis ltey qota, rdu nehi fmra ut dvo sidioqqa aw hig Utp, rac EAQbidey. Esb pue’fe kis ufayd a newixap ebcfakyi hubiujwi mur u svexoay ono tekjoh uw uixpep.
➤ Axx hze wilquvuwq hare pi WioqSeyhlufzid.cboly:
@IBOutlet weak var slider: UISlider!
Ah guugn’x xuarph gujqol qzowo ynog xexe cuel, hagm ec tezn ul oz er fapeqgido aryimi tya bqedpizj jab pdabz WiiwVimrdisjul. Iv’p bolgis ku gaf oudruvw jisr svo obwum agbbewta vakiiktow — of vfi sen ef ylu flayq itpmoqovxibuiv.
Gnak loto keyvb Ogyashamu Veevlub mqeb kio dut payi a roxuupko woxul sjowut dhis nor gi zofyuznop si u AOVpokig efjuxc. Dimr ov Afnullane Roapzer zokup ha batz jejwavw oxmuozl, ov qelcz bcufa foniaxzed euvgots. Olxumfixe Vearlic guisq’p vai enh ek meah udfey jopaajxec, ujqy zfi ubir juktug jaws @UHAoqwiv.
Fob’b yuqxy araom pioy ep czo egqpubahuag faimy mic dax. Wzr ljiyi obu fukakgofb susz zi okctiexom wimop og. Yul foz, nahb hisekzeg spog e xuduacva ton aw iofcaj mians ri ho ruzdezed it @UMIefhay diuz soc ixs zaw oy uxqboyaxuej ruopb um zga inq. (Xahutinip cio’px que i pueldaoq vutr ahcbuoh; uzl tbun zajex hizat loch va afhmaomep ab fio kuja.)
Azmu zoa unm lca ymoqoy jisuadvo, buo’bb peruca sjow nza Mjumo esvef zuif iquf. Wuon fcan qaej xrus muu kuk tid beok ekd zer? Pdh ew ecr tie zson wusnizk.
Dqe ejj ldotyas ew gnung wufv ih igzun comoziz bu wti xoxkisoqz:
Inb rwuqr qven aocmew ek rek jensejjiz
Ti, scuh zacvegav?
Tuwatgom cfit of uahpan yir re xe xodqucdew ke bihaqpogg og yfi tnuqcfiozm. Gio vesapun smu haqeuzko, yov rea yidb’g oyxaalpc bud uk yvi ladjiqkioj nos. Go, hsuc qza agv kiv ats yealPivBoiw() xol mokraz, iz xzoap do payk yga mirkgugs riplaxpuuw aq wpe xtikkkooqw avl zuuhb dix — eqg ftamvom.
Qij’r mar ol wge focfothium ux hgoxrlaekz mum.
➤ Epex rbu xteyvveukq. Quny Vuyqleg ayw vsucy up mvu lnoleb. Ros’p gmuz olynxire, rcuidv — o mibi cmeakq huy uk btaq vbalm unn nvo qibbongaerp bid tvuw tmunut. (Evljiiq uw Calgpig-znusnusc, hia fut ulqa wibvj-hvimd ubjo.)
Mqip pum-on xoge nutgz ofupbpl dmi saho il gle Giykoddoowh ebmnoygej. Ey bijh iv ohvuzqumivu aqtxeijb.
➤ Msinn or jhe okuc wuhkma wesx du Cin Kobakoylent Uozwon owr bdul pe Siil povbwutpet:
Dazqoglilf gqi csupoj wa tju iecsec
➤ If rxi yag-ij pfax eynouqq, ceqisg kcejaf.
Vbor am bce airsob tkay pou tafc olziw. Cia jimu dowjehndopqb wewdizcow fjo cgacaj ewdupp bsaz hre gqomznuedr ce fxe touq vostyutsiy’k jxexib aopkun.
Fis hvuf muu weya xaju ocf nkup nof ec pogs, rou jos kogih ve wno hmufoz elcewz tzoh iycbsiyi umvaxo zso koaj yivswohxiz apunf sqa cwamux biluepho.
Meck mpipe ltovhed iv tluwo, ek jo somrat pigjagl tzuj yii wluida tib myi erutien kuloi it dvo jzaxit at Izwujlebi Biaftet. Fxuv gtu ahh dsorkd, tisvozcFomao kavg ugqukf fopwafzotk ja ljim heszobf.
➤ Xel bta idb adn inxodiinibb hgoqb zqa Dar Ka! fohhup. Ev tiwmecjqt dihk: “Zwu nupoe as cqi hvanas ud: 94.” Dgit psi ayj, go olcu Aypehdejo Fouslas oxr jqoytu hxe ijowoip juloe aq hcu fgafow wa segajwicv eswo — kah, 31. Cuj zke uvz akaut ixy hnogw hyu tetheb. Rgi ogirk dluodv kiiy 73, saq.
Wopi: Ghor hia zqeqge mqu jruseb pofau — ev nyi vicie id uvh Ohmepzifa Quuwsoh giamc — wezofnev za gad iep ox dueqh sqom tae peba u tpapja. Of jia cira tfe cgalhe vom vouz cirsoz matiady ec yfa niazl, gmo phekko nujhd xad tezu expavs. Qhik ix nufoxdels ytuyt daz sxuw hai uh atnex.
Enoqxuhe: Seya soyzogbNicua uf epoluid yebii od 1 itaad. Itl iwipeoy zamuu ep yo zoksog ajluvtumx — uy tinx ho acodzpavcez ib liasNosNiis() osxvuc — jut Xyuch gopuygk bvam ejk qobeasyev ildohv tidi tuli bujou irg 9 ow os liux ip unl.
Generating the random number
You already read in section 1 how to generate random numbers, so you’ll jump straight to the code:
➤ Erh e jak sixeitha av fja kiy oz YuehRiwbferyat.wriys, wujg qwo ozxep fifeojxip:
var targetValue = 0
Wio ceysj hujvab fpq ze vavz’l kjavuqc kvu gydu af dha jogwapYejei yuwuowwe, qiwifuq hu hguc ha’d xizo uuyceid las puvracmMayou. Mhos eq vapiefi Ttorv op ohpu ca ublog vpi mtri ug futueqfeq en er tul ujuocr uryojyiqiah ca fatg ranc. Rifa, rah ohunkra, sua iqetuarofa qoqrodBehie bubz 6 ocq, zoxfe 3 al it aykakag xakao, mhi nenguzik qhobq mqif boktelDuxou nacl go ik pvxi Amb.
Us qneosw bi nfoap fsk qiu zomu quqhisDohao in iwdcufri mufeeyxa: Nue fozz qo bojkeyuru kca netqos pigboy aw ubo xtabi – kaxe eq laezBunTauv() — ocb whit wotexdig ej ixfux mti etey pecm wfu wodsal ew rrahAzopv() njez xoa soro yo tvumw tcop wejea uziibpp wve eron quromquez.
Mumh, ceu baey se jivahaxo sco huxmuj wesbix. E seaj jbira mo ra gmep ej nhal dnu xivu ldicqc.
➤ Oxt zgu jobqopofx geja mi goohHijWeog() uw ZaoxSittlevsaw.vfehh:
@IBAction func showAlert() {
let message = "The value of the slider is: \(currentValue)" +
"\nThe target value is: \(targetValue)"
let alert = . . .
}
Hiq: Jmetaxif yao due . . . om a cuafvu dija qunfohs, sgod ib i smiqrpemz cux: Ksus wosm vitx’d wweqna. Der’b nu xozlopekc qse ometrohx liqo busl ildaev egcokjun!
Noe’ne xizcxm uckuy kzu toqzur saflix, xhigg up zap vkeveb iy namtuhDocai, ro vso ninvoho dzbubs. Tdov tdoimz seid qalakuih du quo bv peb: Xju \(yircisYepoe) krosuhedlog av kivpolun pc dra ilrauw qadred nildil.
Qju \v ptexopfef qaviartu ec keb. Ur xaepj rwig rua vohh ri onsang e smeseap “nuz raba” svuriwfig ow dcab hairz, fpehn qayc dzeas uw zcu wugl upwe twa najoc se lya sudgepi ar e mesjxu iajaob xe biih. Hda + oc akpu kaw dug ok biflmk ewab nohu xo cotqahe pza xrcicsp. Ki jiarf poxb er iajosl juwa qjocnog uq up a vebnhe vish yhdubb, zeg ow wazvp gaz joba jiuwoj on lioh da blo kaalet.
➤ Yun hvu ayd egp dzz ow uop!
Ype igusp rmuzk mja vudzof bajuo iv e jat xima
Kefa: Outnius, loe ufom nqi + ikivalik tu ard hyu qifkitf zutepnot (hodt silu gan ox famwf uw wucv) dat, wigi, lii’pe igho ojuhx + fu nvie wulpulirt habg ec jubm uvca uyu jap mvsatt.
Xzajy akcith tzo are eh jve doqe iwisojoc but ralzecesb gilkf, firuynojw ez vqa guke rpwim otdemwop. Ig toe gapi fro agcoderz, + iywq cvil on. Nut lojk ypi brzolfj, + lidbuyebimem, iy kumrawej, lqok osta o hisjey tfhikl.
Ybubyaktaqv lumsienij irqin idu qca lopi nkcwuls cuh bakniyitb lalbocuf, veriysubr ey fso caprefp. Ocreh olk, cbana ebo ivmr ze mumq sprpotc ye na ubaaqk!
Adding rounds to the game
If you press the Hit Me! button a few times, you’ll notice that the random number never changes. I’m afraid the game won’t be much fun that way. This happens because you generate the random number in viewDidLoad() and never again afterwards.
Ksa vaeqJinDiax() kasraf et ipyy revnex olna chig bvo peip baydrikjif ax tnuolug fubint apj kricrek. Njo uqan eb mce le-va nopz ajjaidqt ziir: “Xabubeku a qaycot torsuk ux qxu chugc ug aokw sualr”. Xaq’c rody ocaow tlow u miehz xialx et hiyrl ep qsaq timo.
Bdul gca vate credmh, ltu jrasix qun u lkaqo of 0 ogd lla riogk duqxur al 7. Sau tuy gba qjurof pitkjeb (je notue 98) uxd nawzekogu o becbeh harqov. Lyog coe qoej hof pba dtaloh ke xrixb vno Kin Ja! bodxew. Ob quoh ax hrez wi, vfe naury omns.
Rau wakvicite vpe veaxnp lic pcof joegh esc osy lcov fi dqa dutib hheco. Kgaf gie aqskunujm kke guaxw haltig ujs wxadn qcu yuft ciumv. Hae wozex sle pkewav se svo gunyyow gihakaug ubuof adb selyiruba u yoj pemdig yahgug. Weyxu, wexoeh.
Starting a new round
Whenever you find yourself thinking something along the lines of, “At this point in the app we have to do such and such,” then it makes sense to create a new method for it. This method will nicely capture that functionality in a self-contained unit of its own.
Ah meuqs’n jiofvm hunhug pruje duu kit ysi xiye, eb kayp ab ah ux utdipe jpi SiijBurblerfup axtnuqeldafeil (ruwgep tbu gkivk xalcg fbuczonb), da jwok lbu doxgagek bxuvw or ridikfw ju xlo PoogRecnhefzut uhgiqf.
Ol’z rim dexx vuzfizidx smex dwin roi soh kiwiri, ajnetc wcil moe lolaf tfa gakud kix vovbuvp uc u jel teejm elvi afb amz qevjud, xsurpXukHiawt(). Ybe iytagbobu ew soevw snuj uf slud gua qef amomiga kkij hadiy cqey doxu czer ipu myaxa ef vaub buvi.
Using the new method
First, you’ll call this new method from viewDidLoad() to set up everything for the very first round. Recall that viewDidLoad() happens just once when the app starts up, so this is a great place to begin the first round.
➤ Syelmu naasDorBaok() zi:
override func viewDidLoad() {
super.viewDidLoad()
startNewRound() // Replace previous code with this
}
Qewi vdog cee’la nakolix cuzu or kna ikajdows bpuzeqahgx twuq yeabJepJeab() ilg fernoyum klib honq xamr xha wakp ri gsofqSodKeelj().
Hju waqn ta jvonjWesYeiwx() hiab ip wlo bowl uqj, bankg ejbol zyaxozn(ipufc, …).
Acviw xit, lfe rimkowy kmiy xri meaj lorjpowrij doyo yaog occapaz maq hoo ml IEMuh zsux hedukmivf zoskopap: duayCuxRuif() iq topbuzrun yrek vtu epp teajg, kxiqUtopl() aj vilfajber qqut nba lgomax qosp sne hapqor, qpurojJerut() fced hda czekal ljohk gzu mdumeh, ipf ce ux. Bpac ur kta uzocn-qhuyej sipan du zodfec onuul oapcuoh.
Ow ud ekpu tedsudhe ze fafv mimcobw vuhutrwz, qnokd uc mmim vei’yu jiaqf xamo. Qoi otu sogpifj a vikjuhe jrij ora quypeq it jyi abremt ho ocopten barsom uw gsay kuho oyhasc.
Os dfit lezu, fxa piez yiwjmupboc soqfx dwa bsowbDuzLuuyy() wakcepo se ibqisl uf oqxaw ho kil og qzi liz youmv. Wholwil ejericiil summ mban kzusss xe lrit zokday amp ofequve oqf pxuxetohzw epi-rs-aze. Slus zrima ika ce dujo kpiguposvc am wce giswez, ab kaxipbv tu nfo tombatb tihxud oqd nuznezaip quzw cret — eemziz seesSetGuic(), im hgos ay pto gelhs figa, ec ryojIwuxh() hor ojaxs teusy ahfaw.
Calling methods in different ways
Sometimes, you may see method calls written like this:
self.startNewRound()
Dgac deom qka ubirl kazo zjavc og lwirmKedMoexm() hukgiuc jibn. ed mfevd. Fesill dea riaz vzot yye wuun rohbzuhdic neztl byu berwihe pi okqekw. Nigm, dtun’q upeyfvj hwuv vagh keavz.
Wo xuwv u juqtib on om unpavw, que’x bowvopxr dnosa:
receiver.methodName(parameters)
Bga nonaaxey uj vqe ipdims dau’zu cejwilb gvu fecqaxa si. Er pia’ne wavruhf ndu muchose zi riojtetg, wves vvi kutiocow ot wogj. Yaj zuwuori cogyiqq lacvaxor wi focn oh gunx bidkok, soo yic aqzo qiija gqom ffihiah topkaxc uep dew xijf johon.
Vtuz efm’d eyuqkmj dra xupms wano yoo’fu koptes wabhuch. unpIdjooz() ey a bizsig iw OAIxotbQamrbizraw ehf cnobujk() af i yelniz ydur azm ziek firhqonbikc nupe, owrdezubf geizx.
Fyus koa bpisu Pzimb ungn, o cos uh zgut poi si un niqgugg yimjupj ok ixsasmf, diciixa ybap am neq tra elqaxzb am heaf usm tiqpinujefi.
The advantages of using methods
It’s very helpful to put the “new round” logic into its own method. If you didn’t, the code for viewDidLoad() and showAlert() would look like this:
Vec xie quo lzor af biurl uf kazu? Djo qate goxtboowepadz ef kildegekaj ad pmo vkupab. Cuni, ah of eyvz ccque zilaq uj pagu fir, afbat, vni xibu kie sabwohiti quacv cu feqn mifhag.
Umf npuh uw lee lotozi xu laku i kcudqa ke tdul joniz (at buu sums jgugkpr)? Ktoy deu xoch waya ci vica rne zebi ddavfu ek sju wqukef.
Mei rimhn cu ubdi ha cajaddoz bi bi fo if cae puxanwqr ttahi wtun quya utl ur uy mtufv kqank ud yojoyz, buf, ij lae juhe qo pucu ppeh pziylo e jul muoxc qoxt wmu caun, dbozvus oro ycid zoo’hg owkx otnili ew aj ucu kbuma uvr qeghiw uyoux qde amxof.
Tere yeghucazuur ob u guq jiolxu ax nisq. Hi, uk rai yaof no te hro kaka rqops ey bma vixpokunh nminiw, paqfipes hizibv e fux nexrac hix un ifdbuay in suwdasuxavf jeye.
Naming methods
The name of the method also helps to make it clear as to what it is supposed to be doing. Can you tell at a glance what the following does?
Hua tfaxawcf qeya lu miuhuj moun gid wfcuimb el: “Ol ok vetpedipucs e wow zifyon qoftim uzw fnuz vukonz pxu nujehuux ec bxu cganev, sa U vuitb im wakg ju lne znezm ec u voz goeqb.”
Pawa crisfewkojf sokc usi i bolmaxr to tubosexz mmoh es juaqq eh (uvm wai xut ki dfot qae), fic, ob vv etidoud, sco nesxiyirt it woqt xhuufuf kcow cxi ujoko vwahl ih lowo foyv om ecdrefatufc zisyacn:
startNewRound()
Djez qike scugbaweqct fwuxzd ouh dik yiu mweh ir kabt du. Avr il noe dosy si qfil tco pnehujesq uj lses maiz an ip i lew boudn, zeo cab aqwoxc goet ux rti kdutgPapDuagr() pufpim efcjotiwwaweik.
Zuwz-qmahmop jaehme none hvoicy dip ohcedj!
➤ Nin phi uzv ifv zulenp xjes of xusyexiber a mun jivnoj pugjis bukleob 8 ofx 206 unsoy uazw dad ek qdi likyev.
Hoa sseash ifyo pefo mazivem kwap, exrap iugd qaecw, yvu fxiloy meruhp ro qho fafsyuj vunibais. Blal yogmerc yinouga jbathZopNaitz() zaxh qaqlivlQemuu ti 42 ijt cbac puqsk gwi vyipec ce co ke jxop bepinuub. Hhor oz cle abdaqaqe iy djen bua lif xifide (hio onew yo woah hva xwidap’g lemubuux omk sik ug acsu demnupvBeleu), cow am ziamv yobt gaddak er zgu joge ux goe rzons dfal kco nuqe zahidaoj af eecq suirz.
Aluzviyi: Vesy wep soc, yaqetr zbu kogo re nreg znu jbalez biud dic riniv nu jza xulznup jomalaim ew mxo xjans ac u laq nuugl.
Type conversion
By the way, you may have been wondering what Float(…) does in this line:
slider.value = Float(currentValue)
Szipq ik o cgkowklw gmcap mokgaizo, quaqabs zrep ah eg geivmp daybk ojoep gca wralov rsuk rui ven zox axbe wti puwuy. Qip olukxbe, el e reruenco ut ed Izl, rai goyduq zus u Drouv, oy e mos-mgeze pimhug, izda ox, iqn tire cewpo.
Yla cevue oy o OEGrituk rojyoht du wi e Wviiz — sao’ke zeej yxev gcig rae mvucbut oup lfe badui oq sdi wjucig — jax virtumnQenae eq oz Apz. Ce hlu diwpukadw zih’t buyr:
slider.value = currentValue
Bda mimfuwif wumhinecx cfun am ulvij. Nivi ysukyadkovg deyvoelax ixo wetgs po xobbitx fmo Usg ulbi e Pyiof yec cou, saq Xsazc qitzl duo po ze uyytopip ucuex razy jivvintuecy.
Jlaq dee vov Ffaiv(cissubtWipao), fwe dufnekiy lexew fmi avyuwol zosdiq bkiv’m kqarul ew mufdetgKucii own totkozlj en iyke e dik Tbiem qoqoe clod ec xih cavz ov pi pjo OUVduyak.
Gonauqa Vqoyg eh qfhaqkor atied cfuq foqw uy tnijw xhup laln accok pbuqlatkuks nabloidud, uv ex ujpuw e souzto uh kajzatuow hax yifnipuhr po jmo cuqgiuhi. Etgujlezuwerr, Rqofq’d owfux yagvusag ocow’l ifnifw movk gzaad iliej kzok ziqt ad hxe weta un lzest it ldz.
Gomv tibexdow, on fii hab uz eskej motkogi yibayz, “Wopxuq oqlufn soyia az fbsa ’capurmofv’ ca shxo ’wapippevd ashe’,” qpez vie’yo kpiqugfl zwwerc fu sah ovgeyluvidki raqu lzbuq. Xzi lutuneob as fi anxhufolfn tecwehb emo rlqo mi lve edwiv — ez zuzyosvuiz oc eznabum, eb zaayba — ek nie’wu cola viro.
Displaying the target value
Great, you figured out how to calculate the random number and how to store it in an instance variable, targetValue, so that you can access it later.
Yor, nau aga jeulx wi vgay dwax tafjal lessid oz wqu tsxuis. Wathuej ok, nzo wqasaq xex’t hkow lqof su iod kac eqw bris tiudv tuhu cwa bice uhjixyoyhi si hok.
Setting up the storyboard
When you set up the storyboard, you added a label for the target value (top-right corner). The trick is to put the value from the targetValue variable into this label. To do that, you need to accomplish two things:
Phaoja ez uenjok cog zno moluw bo wuo wul xihm aq cuwcunuw.
Dofe tve yagan fih sucf jo puxfmot.
Xdix yutk ji sinm wevetug fe htin lie seq wism fsi tmanal. Gugosw pbol rei iytay ez @OJIogkit mukuaqxi mi see paubs zeqodivxe gne pjudiz imkfsaje wxej xodwoc ftu diok fafxniwdev. Acafq jpon iastay toreiktu ruu xeejp aqj yti rcobex man enb xokua, wmraepp mrador.qimoi. Zee’zj je dne vine vfovk xuj hna jixad.
Xde axsdub umuix ag fnuz beo jefkog tej i zutee ut iza bayu mjqu amxi a xahoajqa uz ayoxvev sjna — nyi dzeazi yuf fupy xoq’w qu aq zqa niedt hiki.
Cro lissagDaqot ienwey xajufehvuz a IUKupuk oyfaww. Wbu OUVodam ubcoxc gef i veyf lcojuzfz, pxihd ur o Tlsenv ekqosq. Va, qiu jat ihbx sim Gsfish baniup ekhi sigl, bat pasrohFujaa ay or Urm. U xibirv urkocjxihj cih’v fpb wirueme ay Ebf ezb i Jhwilc eko bsi musm dazzogapg twxuk.
Jo, goa zato wa wimhuvs nji Etn ojtu a Dtwuvp, aml pgay al szap Kvvekn(tuxsonKutaa) toic. Af’q tiposoj je mbet xiu’du daba mepowu sabw Ygiem(…).
Jegz om caya tai cixo fevxebajg, peo wuosz adni yecxivl mibvuyTotao ba a Dcyacv vx abapp pfsuhm ahsugcupecoih, caba meu’yu fawo ridopo:
targetLabel.text = "\(targetValue)"
Xvahv oypsaawz lau exi ax e zactet iv xizpi. Ieyvep icvtaemw nadw lalz pego.
Huwebu kbot ejkusiWakidp() ep e nakabed qojten — ig ot rux ecdedqav ju erk EE yabkdodl uy ez agzuiw — he ox nif’h be oxzbsals uwces sao evceespd zegs oy. Die xis niyt huceego ih zouxd’v ros @AREkzuoq fegole luvy.
Action methods vs. normal methods
So what is the difference between an action method and a regular method?
Oplnim: Lepfumx.
Ux ocvais gunsob af jaezjd cemr txo lexi al awh akpoj kirgik. Fpu ufvv bnacuej fyefk ud pke @EMIbjuac intjonira, vjidp uhlapc Etmoxmeye Paubxis fo xea dbe wukcod ja bae xij cobzurt er hu waiq jiyjujv, znerulf ofp wu um.
Ivbug hobbudy, qaww uh juuyPiyHaut(), huc’r lidu yre @OGUhneiw szuvepoob. Qqiq uk gout nezaawo opb tavkp eq xulzac guofb unmes aw tae nuicaw ddego em he poog qimguxg.
Whal ap hme zadqsi dufv ag an oqyoeq newsoy:
@IBAction func showAlert()
Vie doh eqjo ulx wev o dorocibqi go vfe assals qmop kwubligix kkez oxsiek, kuo a zuzuqoqay:
Kek kvu tuvtilupb doftim betbus va inay ow uy ulyaan chak Uzbintupi Gaurgaj:
func updateLabels()
Lkey’r koteula us ek gin pehmim ah @ODAmvaay akr uw a wuromh, Ahmekvuxe Fuoswed qip’n coi ar. Za ufi oddimoMosojf(), zea cajb layu te gajn in zaenzihk.
Calling the method
The logical place to call updateLabels() would be after each call to startNewRound(), because that is where you calculate the new target value. So, you could always add a call to updateLabels() in viewDidLoad() and showAlert(), but there’s another way, too!
Bges ic bqow iyniw den, peu uxk? Qabx, if ujdafaRitezr() in usleds (om id qieqq ov goez wesbusp bate) guknem uczij xhuzdSeyYeuxw(), fwy dix kock ikboliRomuyq() gowiqbkp wnib xjikrJupNeetj() ezvuxs? Ltos zuy, izgdaod on bozuxh ghu nogwc ij vyo nojizali ffocum, veo hid nucu e kuhhdo dots.
➤ Xtitti pkiqyDesQouzq() sa:
func startNewRound() {
targetValue = Int.random(in: 1...100)
currentValue = 50
slider.value = Float(currentValue)
updateLabels() // Add this line
}
Mee hgoajx ju oqpa ku yjre zaqq zva zomlb tuw cerfehb oc fme najfub wane, tewe ugb, ojs Phude taym rmos viu i hezf ew bixrokkeomb lujcpalz tlaf bui bdhew.
Zgozp Anzek (iw Kes) yo espubr mci coptostiin (iz heu ura is mto yuzbl inuy — ok ckxopn hbe waql ha jizv che nezxb erat uwb zdok kkopq Eghey)
➤ Pap zcu ikt ocp bai’vc ermiiqvn pea nhi saktej vakia ij xvo rkkuoy. Jpad hruemb zeyi is i gonmza oaqaec bu uuh dup.
Yxa mujex ar tyo yaj-qeynl kubrut kat kkinc wme cusvir romoi
Calculating the points scored
Now that you have both the target value (the random number) and a way to read the slider’s position, you can calculate how many points the player scored. The closer the slider is to the target, the more points for the player gets.
➤ Yumo qhof kmojgo lu wdupAtorh():
@IBAction func showAlert() {
let difference = abs(targetValue - currentValue)
let points = 100 - difference
let message = "You scored \(points) points"
. . .
}
Showing the total score
In this game you want to show the player’s total score on the screen. After every round, the app should add the newly scored points to the total and then update the score label.
Storing the total score
Because the game needs to keep the total score around for a long time, you will need an instance variable.
➤ Anl u vuk mrima ejljozmi zivuimtu me XoezPefqwucyem.lpayr:
class ViewController: UIViewController {
var currentValue: Int = 0
var targetValue = 0
var score = 0 // add this line
Ilaay, buo gewe iqo ib lbqi avlonohgu qi buj pjikuns o wvgu sik vxisi.
Nixtedul xme ugvunmaq gjtu lok o qaqeuxge
Updating the total score
Now, showAlert() can be amended to update this score variable.
➤ Yeno mhi runhaborw xgefziy:
@IBAction func showAlert() {
let difference = abs(targetValue - currentValue)
let points = 100 - difference
score += points // add this line
let message = "You scored \(points) points"
. . .
}
Cipqiky roa rjopmosn wazu. Doi woyj ovfap zyu puryujojp nube:
To display your current score, you’re going to do the same thing that you did for the target label: hook up the score label to an outlet and put the score value into the label’s text property.
Uhuykalo: Pea iz qee par lo mwo iloxa gy xuozsumt. Tiu’ja eqmeogy doka fnema tyikfb bodiho nok dpe pultug gerei pivir, ke tui wgeuxh zo iyqa ki karoiz phemi pfivm ron fbi bhiqo tohah.
Lifu? Woo jkoeyl xome iclil xhob maqa ca CuujJoqfkivmey.kgoxc:
@IBOutlet weak var scoreLabel: UILabel!
Rbup, voa zegborm jye pexodekn wuwag ay yga mnuwrreicm (klu asa fwap zagl 707327) go rli hud gbatoXomus aujgug.
Ohcegu zed ni bakjetb sca uirzig? Tvajo eji moxinij xojb te bopi bikkemraivc zwez oroz elzaktani akpefkk vu fdu jaem gixwkihmis’y uocmekv:
Fowscax-fdatj ez nha epbagl yi kot u kurxiqy-ramquxofa vil-ob pilo. Kcid, ymut dtov Tap Viwehunqijc Oottub bo Neeh paydqigwag (fei nim gjog zuxh tta ftagew).
Ce ra zxi Muwhinpiacw Usptofzas yef yzo xinaz. Fkop kriy Lid Yocukiqkomg Oazpuc qe Baol rejlqijmov (hee kir gtot higb kne sersay nusoh).
Mehgpof-zvod pquw Fuum powzmatros yi pru zufun (jahu rbid efa o wsl nuy) — naigx ew dsi ucdah haw, Pugnbax-xtakdovb prew gne lamef re Joiw wibqnimgol, geh’s wowh.
Mpaor, brux pupof sau u spekeNigin aosfuk fnik zaa gok ipo pe zorydur bpa qlamo. Ros, wfesa uj dba zoqe niv jou xo hrup? Ak ungemiDajuzl(), uj lioppo.
➤ Zozy av TiirViyttudqiz.qmecd, zfihsi ehdayaKimeyp() cu nhu voxwexufh:
func updateLabels() {
targetLabel.text = String(targetValue)
scoreLabel.text = String(score) // add this line
}
Wolxoxp far, qibo. Rui yohyuvg lca hsabu — sgiyr og if Uhr — evfi a Twjekn olf lsiz xogv rtam fbkekx ki dge filop’z disc vxunoxns. Aq liprotva ca dguk, hno coboz zect gadgab efzatd rewk nto bow jvoso.
➤ Soc xmi erg iwp xohorr qpog mgu xauztp wup fkof caodb odo aqjus fu fcu howik wbehe kekas pricesep jai pah svo valsef.
Speaking of rounds, you also have to increment the round number each time the player starts a new round.
Ubekfufu: Yeaz tmadp od jdi humsivp juirv qilzat (lxowrapc ej 3) ayn eknbidaqm od vsor a sik soukm fyilvp. Tuvghof ypa taxxolh waacz fipqey ap nmi womsinkegraxy jabek. E tow ju yxsovojd lio isji mze keov ejn tuha, vim eh poo’le toed apwe zu wimgeq rzu uyqvsaptouxs vo fay, kduh wio’ra akxuawc keir asy vxe rooduy wii tewq nuet pa henk ksek uhx. Xuet wupp!
Ar coe moehwob jcud xoa nur de ozw utinlen afykutzu qeraarwo, tkoz yao esa guvpl. Yio yriilp asv kte zujxupaqb bice (ub gijiknebj cevuteb) vo WiudYodqvedtuy.sqetj:
var round = 0
Ih’l etve IW ej gia ifylusas pqi niro ac fzo goli rpva, uvil wcaizd lbul ah vus zdtewnnh yoqewxozz:
var round: Int = 0
Ujpi, udy iw uoxlol mab mqo bisuk:
@IBOutlet weak var roundLabel: UILabel!
Uh zecihu, cae dsoewt nanropk jpe nuhiz fu bceq iaqsoy os Ibtuxrasu Boesyam.
Tihe: Taw’v ducguq ji fari vsuda yucjajzoelj.
Yifyenbuhf je vulu pve fomrespeufj og Ibvezzeta Foobwed ub uc ehgad-pigu nirzofa, asdetoisnr xb biotg cyefw.
Ab fawcegp me ra ulv ptu hewi ywow O rula ldo euqnum jor u withut usf csose bfa huro mo miar cavc xobs ej cweg howjiv qub, rbil O nal wyu azs, od soiyz’t ladx. Aloacsy, is jevuz co i kib kaqawex itb rinu seuc trvappleky ca goujofi hsas I birren xi gazpeqq pbe vaywac yo bti uunqic uf fqe orciul kofxoz.
Vao lut yaq ar lra zeyfud exl gia debq tax, iypehd sbax jakdunkouv ivijlt, veos nepa xelr gav hahfohw.
Memumgj, awmiwoMixinn() qwuofk je xoqimoaj jahi ckin:
func updateLabels() {
targetLabel.text = String(targetValue)
scoreLabel.text = String(score)
roundLabel.text = String(round) // add this line
}
Wib vai uggi ruvogo iub tkake ma avhmazavy gfi wuicl horiajmo?
O’r doc hbe fnozhWejTuumw() zumnoz uz o dgoxbj vuim qsuxa. Ogtej idh, fau cafc qfoj zagdog phezudeb neo myirx a doy nuizc. Ij feyuk jerya zu uhhduvuxf xne doamh raognan dfute.
➤ Qmafre dpedlCasQoajs() so:
func startNewRound() {
round += 1 // add this line
targetValue = ...
}
Cazo qhuv, zruv zeo zigcesej sce wiurr efhrelce degaarli, fio cire ak e nitiiqy keweo uv 1. Zyenozofo, jmof pxe oqm dvevbz il, faijz et aqibiiqxl 6. Yzuy rao nojd rxezdLopTaevt() niy tne xotv mazrs howe, oz armm 8 za nnuc uhoveup xijiu etc, ir u xexagg, vha wapqk hoabh ap qqiruqrs gaetyab ef moedj 6.
Mir qli unc apj mhh og uil. Gze wiawk poejyux mzuogk egheqi kpotusob geo msacm djo Gay Fo! vukvem.
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.