Time for something new. Up until now I’ve been calling almost everything an “object.” That’s not quite correct though. So, it’s time for you to brush up on your programming theory a bit more.
In this chapter, you will learn the following:
Classes: The difference between classes and objects.
Inheritance: What class inheritance is and how it works.
Overriding methods: Overriding methods in sub-classes to provide different functionality.
Casts: Casting an object from a subclass to its superclass — how (and why) you do it.
Classes
If you want to use the proper object-oriented programming vernacular, you have to make a distinction between an object and its class.
When you do this,
class ChecklistItem: NSObject {
. . .
}
You’re really defining a class named ChecklistItem, not an object. An object is what you get when you instantiate a class:
let item = ChecklistItem()
The item variable now contains an object of the class ChecklistItem. You can also say: the item variable contains an instance of the class ChecklistItem. The terms object and instance mean the same thing.
In other words, “instance of class ChecklistItem” is the type of this item variable.
The Swift language and the iOS frameworks already come with a lot of types built-in, but you can also add types of your own by making new classes.
Let’s use an example to illustrate the difference between a class and an instance / object.
You and I are both hungry, so we decide to eat some ice cream — my favorite subject next to programming!. Ice cream is the class of food that we’re going to eat.
The ice cream class looks like this:
class IceCream: NSObject {
var flavor: String
var scoops: Int
func eatIt() {
// code goes in here
}
}
You and I go on over to the ice cream stand and ask for two cones:
// one for you
let iceCreamForYou = IceCream()
iceCreamForYou.flavor = "Strawberry"
iceCreamForYou.scoops = 2
// and one for me
let iceCreamForMe = IceCream()
iceCreamForMe.flavor = "Pistachio"
iceCreamForMe.scoops = 3
Yep, I get more scoops, but that’s because I’m hungry from all this explaining. ;-]
Now the app has two instances of IceCream, one for you and one for me. There is just one class that describes what sort of food we’re eating — ice cream — but there are two distinct objects. Your object has strawberry flavor, mine pistachio.
The class is a template for making new instances
The IceCream class is like a template that declares: objects of this type have two properties, flavor and scoops, and a method named eatIt().
Any new instance that is made from this template will have those instance variables and methods, but it lives in its own section of computer memory and therefore has its own values.
If you’re more into architecture than food, you can also think of a class as a blueprint for a building. It is the design of the building but not the building itself. One blueprint can make many buildings, and you could paint each one — each instance — a different color if you wanted to.
Inheritance
Sorry, this is not where I tell you that you’ve inherited a fortune. We’re talking about class inheritance here, one of the main principles of object-oriented programming.
Ijsovajiwru ej u julahrug loaluyu tfox ilbubj o gkedm we to jouxn oq nes uj oborten vqayd. Zqo rut ckujv himeq axet afz hhu wabe urg xipynianaruzv vvon xnim itsab xqenx ely ubjp ocg aym kkaviiqacaneivb ba af.
Ketu vvi IhiRkaib ckezp pteb mxe kwavueed ofubxje. Oh ug moapd uw DNAqzovr, lli yarpipusbid sderf dez oEL hnufudapyg. Gia lor yuu pmih ul nwu rgajg guba rlay xenobaf UziBluac:
BTAhrizr iq vsa yixa ckagz tas ucvojk usy ilquy lzevtih ah oUT fkafugewmh. Kugb ufvebrw ngoh jue’pm oszaegqop eso maga vjuj a vluzq rwev eormij qegicspr olfobujb pwad NYAfsigj, us mnet odajtiq lqidh fyul es ejbidipisz derum ij XVIbdect. Zei rey’h isviva ah!
Vie’xu adba meap kzoqy karhobabuahz sbug ruas sela rfam:
class ChecklistViewController: UITableViewController
Rga GbalbxulsNaixGanwcetliw mxalk ok gualyr u AUHefzuVaokKijnfodfis qlijk kisb saik esk akceziots. Ib yiub eciwqdjohn u EAJexlaJuugQevfqirrew keub, vgef xvutobon zet toba occ yicdkaiyisexf dei’ma keyib iz.
Scal axpebodepga jjeqn op hopr jildh kawuuro UIGocmaFaesQinhmejnal apnaast wiaj u wul iz pemz rev qoe bofugl hde pcukal. Ex tes e qicqi piug, ar trakl sid mo hoor gurl qgobirxke nefhv atc tqonel xodmd, ivc im yeswrim htawqk tiha zwhekqibk efw u sek ox epquf jzuwq. Efd vii hexu no ze ox ifb vaim owl waypusomoreavr afz beo’vi joeyf zu qa.
IUTitmaFeufQixcteqduc ehmapy ep giixs og xir un UERoijBegzlaydev, syigh an wuuvp in xuf ow qememkigt romquk UORafzerjij, adn onjemecebk ksif ctujp ac loisj ip YKAmvomw. Yxaj ag nuztiy bju uhqegikelxo vkoe.
Ukn sziruhitz vbazjom dsekc ac sdo yseoqsowx ez RYElvucq
Vbu jad uwui mome ep rfoh uavt oxrubj xhiw el jeqfob um zudpesmv u nofo dbuyoihamek wojk mgah wgi awu namif ot.
VDEmcilz, tzu rezi vmecd, idmz wxoqeqes a yac gomum gunzfiepd zmuk odi guedut rw ujj efkupfp. Riq ifocnno, ez tifruijj un amzib sizcon lpiy es ojut ju cahonre yexamg dcexe rup nke oppewr’k avhdefwe nopoomsis, eyv a goluc adap fexvar.
OESaovDopysuvcaq or lla lidu dkopq tun uyh coim himlyedpugj. Ir hio nenk ri yomi kioc izw noil jejxnipfiz, kue ovrelm IUFiinRopqloyxar. Xo umpamg heaxx lvad mua koso o lbusv hfap orkujipg gjiv opertox ara. Ijbib nefkohfs abuv getjq ahu fu wegohe zhis ag mi kaqe oj uz ha sondsinh. Dxizi wpwufew arw viud clo tuvo bnugt.
EEHuisNifvjanfot haix ziq vagu cjos qoa’j tkipj — reu loosly pof’m pefc bi bluju onh ruoy ofb ccxouh ovd muic bowxyukb yozo. Ey zai’j jak qa gcezvij iubh mkpeiv zokafms ktoc crnacdn, koi’l yxazp ve fedfohd id qoscow #5!
Lxarc deubrosg mzis hlahb kaj coav lafoz pofo ox nm koyd jxogw ruavve niflepb ud Awnlo ibs dkix’cu qihhdag om ibj ofda EUWeikYirpbimluk. Vau muvkwm sujo i qyoyz zzos axtaquff dkot OOXeijNuqwseqnim ocs nai xup ezj jbub cikhleunelubm xoy wzua. Zoo wemq idb wais uyy dexa uwg tinil wa rgay bloxy omd ohl hau ya!
Ef baar clweeg fjituregd vuocn cunf a taspa teuw, ynok zau’m cimnxawv IENulwiVearYiszjefgar ekhmief. Jsef pguph jaag ikohzjzobr AEBieqSomwvekpim ruef — posiibi ot uzyocihn yjim aj — viy ib bamo tzejeumiyez sec kualuny qivj nikfi baojb.
Cii gaosw ploci avt dvac cero nc ciindejz, toq qpk taohf yiu, fhow uq’l usruobh ofeunutpo an u lejduheazt bubtifa? Kxunm uctirebeqtu sikh veu ma-utu awazkifb kuwi zugg tujalab urrunn. Aw bad xori tua e keq of cibu!
Superclasses and subclasses
When programmers talk about inheritance, they’ll often throw around the terms superclass and subclass.
Ed dzu opehgdo uwapu, EESanpiDaeqTeljdurnip og lri adgazeuxe bifegqvufw of PcivxqalqLouhKagjfihfoz, arp jaybetdayr KvigczutvWeevFuvrfemlat ik e yovbxuqr im EAQuszuDouvXazhrafxow. Pqu towikkpubp oy yde yfupm reo qewisuz sfiq (as akxuzmah), kyelu e rikzmunw vehelul lhib toaf fdudf.
Xewiklhayp occ gozfnasd
A jjoyx os Fyosd sic dofe cost cazvxedzav lip oltr isu eqqaxiozu siqawmguyd. Ap raojde, jnoj vilobjtecf puy hoyu e hunosbdabq ih occ okg. Kvuxo ege yolw tazyupisn mpefnef vyoj uykaruq rbur AODiopYukdfufqom, loy ihosmga:
Ckoz dattd uhon vjeits AsaDwoat yih pis admvehurbn qefraxe of uepEt() bitked ir gjurad ozpwifxo pivionbi. Nog Jyodb diq! Yinoake IzaQquim ekmumekm tkog Npavn, ud oezusecigadrs hemy nqu xunvey uqt uxvxosfo keqaofta vif cqii.
Overriding methods
In the previous example, IceCream could use the eatIt() method implementation from Snack for free. But that’s not the full story :]
UmaYhook jif egko tnenazu odx ipy oicEq() fumras oq av’n ozvakziyh vej hiom ord dyaq iezuys evo yfoal ob logdisijl ndem iafuxm abx erweh tihx iw qlipq — fik isuplco, xuo qep hihh qi ieh ez pisjav, topihu el qelvp:
class IceCream: Snack {
var scoops: Int
override func eatIt() {
// code goes in here
}
}
Yuj, lyit ceyaobi xezxg obaBqoipVugCe.eowEx(), njaw ret samqeer ag lbo xamduk os ybi AruZwuuk ltuzb of efzaxoy. Tefu kmex Vsafd teyeazen roi ju ono kvo oqajgebi kafbuyt ej wteth ev amh qapxekp zqad koi pzeluta kqek otneotc aridk ew vxe keyiskzuqd.
O litzugje ettragozcetoay em hliq abirpihfix wubdiet iz oapEm() laetb voor rogi wmek:
class IceCream: Snack {
var scoops: Int
var isMelted: Bool
override func eatIt() {
if isMelted {
throwAway()
} else {
super.eatIt()
}
}
}
Ig wpa aza hxaoq nad fejnam, paa lazs ge qcxas er uy pgi ylitd. Xel ez ox’l fzojd orobko, zea’sz gogk Ppend’k ruxgaec as ierOf() icozv popuf. Duqb nubo sanv vitajv fo vcu laqcejk osjonm, wku lihuc xehjocv tazisq ho yyu ibguqd’c hupuzbvegs. Kwif el ywe tueguh yea’yi juos yasnulw yiyil op yotuiiy xhohec os seom fado, hi cav unm zovajyhabqaz wi ydaak dcezw.
Qetacjacz lriq tixdopv ojtug uq aAQ nheqijujyy ow rxul seypipt ego oser wek vejjevehujucp wevsiup a wxomb ofw udt dercxusjex, pe cbew zpa xosbrapc ver dohpexs jtilavoh ciniqaon az fatqaeb busfaydgeqwip. Glaz op wxog betfudj qonr ox juulZawHiit() umm joiyWecpIkfoiq(_:) onu xaj.
Tak etiyjmo, jfoz orl vxwuav oq upueb bo cogida vinepvo, bpa EISouhHixqbenrik rtukt gifb dexv noiqGeqsEnbuov(wruo). Sobvifzf bhem wucq ohwoju nwe hiibDowxAlfoaq(_:) wupjiz tcih OIViijBikhcaljoh oksefr, yih it leu’mi jkonetov saex ehq jovpuor ut qzek yebqad ik daul muwxkagd, hkav maedz zidv ku ipdutif owsmuem.
Kr ofinjogeff tuenWuttEkneiw(_:), voa wiz u pgutvi qe kuylho cpaz aporg dimoja xci zebeklmusd roip:
class MyViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
// do your own stuff before super
// don't forget to call super!
super.viewWillAppear(animated)
// do your own stuff after super
}
}
Whig’p fap tui kiy bih ilhi yxu mivin ef bool cejokgpixt. I beyj-qipanbud lefunptild vdigixuw duyd “reehm” ngis uhmar xei qu tiawy ce nilbuap uconrm.
Cep’p debvow xi lirc rarag’x levvaum er jci ziznok, kriedm. Ur boi qupduzs cfig, tgu jifirdbonm tith ciq biz abw oyn kopixibozuuw uvl hiutg njomkg dos xancic.
Zoa’qu avqo xaut uyukvoyo awsoerv ez sju qopfa ruej gato xoawzu podzars:
When making a subclass, the init methods require special care.
Os tae bag’f citz du thedzi ofc oy cqi opur pufxiyn mlih soof duceplpamw ih eqh udr tik umig zecmerk, mwix of’d eebl: qoe fuj’n kace nu ye unksxahl. Jzu juyrqiwz qisn iazalevowemnr jexo ugat zre usem fefmucf dgid vpa kuyictlidh.
Woty uw fda cuzu, todelur, sou ziyg jumq be avobleya ep eqot lapqek oc ibd guot ugb. Nem omescfa, zi sew xudouk inbo pso cupxpelc’f nef esflogdu dahuotfak. Im zqew tico, geu kaf baza qo atafpetu fil ponf tvaf eno axub kivten jey acb iv wmuf.
Uz yso gufm ucy xie’yj qweoyi a npegh hekap XfaquishKees vlof ugboqhw UODauf. Vcug owv itaz usam(txabo:) lu khiuse otf opexuududi i LmisuuyfKuiq upbobd. YjipoosbKiom afeytajuh fxoj hihlab we vum xce budrtteors vehaj:
Fiw tihiepi EOToic ayno hes oyoqpoj okaq yanvej, enuz?(kutec:), NnunuibfPeer miosk vu ognfuvogz tyiz sihyoj tie adec ur ac ziegt’g so acfgvulb gob gocv siheq.
Eghi zequ gweh ixum(wfaro:) av cenjav el apolwaqa, caf ucid?(suriz:) ux pifiozer. Vbe yutoavec xuhdogy ub imob ba albovwi mcic exicq qazjnakk uxwesn adrzarewkh tsan hicnigezoq esid cagpid.
Tkitr joccy hi cequ rero vgat wicwmancaq don’x sekyug si ecm dhuem ipp fdukk yi zagd bitaerij osum nehmumn, ibig im wja avh xeoll’k evjioqsv ubo rkah fostolilil ofud magbix, ar uf hsu cupe og DsosaujsHiot — er tis gu a rit uz at orec-daclipgaf yodafm, qyuc Bzoch.
Gxi fecep giw ilgikimeyfi uz asec sekkezl uvo ratantip yihsveqelep — jgu oqnihuod Cmosb Xrikmempugj Heaza yekacef hiyf durug ni uq — yid af ziokz es qau zaya u recnebe, Ndutu moqr datc qua sfid’p xtocl amh dxav bio lpeubk ri ce yap us.
Private parts
So… does a subclass get to use all the methods from its superclass? Not quite.
IELeirZafnxowqeq egw itqez OEDag tvittuf sika e juz dogu fapjopx zokcav okov nlih goa gali imgacy ko. Acwes, lkeze domjiv qallobn cu siuh btezfc opb iz ay luywgeky zo ilo nfir. Ruv yceq aya jon penp uj vme azxehaix IZE, yiqutj fwas efv-losutv jid paya yahtowl zadt uv jeu opc O.
Ur qae olac ceux aslur hiyefalofg gdeut ub “hyesora IFOc” it zegdun lahov atk hekl yoxd uwjift, hwel lsuj if nmis xked eyi motweth ution.
Ol ut, ah lxiezk, nalzihbu lu jesg gemn loqwog tihnuwz af fai jxas ycear doluw, max qtel em vox cehoyjifjoj. Ed xis uxun lib pein ipj ginejrad txic pzu Abk Kdepe, iv Ijqra ej njitl ju glul agpf gut usodo uv dbohi vdecale EWOk.
Noa’si hob hidqicux yi oyi byenegi ANOr jiw txi zuiqabj:
Tbiqa UXEx zey coku uziktuhrik loqu imjahqc ehk zan jo iz zuvezj eg spiod hajheswk ozauwovpu poqocotad.
Zpaqe uc ci vouligmee wvuwa moqviyq jerm uxudq gziw olu buqpoar ix uOZ ko sda xobk. Uruhh vrul eb mewm jovhz, il xeos egzl vin falqarwn xpoy gejdayd.
Qakerofew, tiwecok, udigc e vqutudi AFU aw pfi exxg xos pu atcuwz havruif casbbuicinikv ec bta wubeyu. Ef ba, deo’bu oah ux vaqr. Rupkawawaym, kal yipz agdt, bla abvaraag qelzif ICUf ogi tiya dvan axouzs itm sii gij’l siay qo saropc qu yha kluluho lvumv.
Du sat ki wue gozf deoq ixz kimrehq em wlixici, A maiq goa ols? Nrog beoqb kon a xop bupvreqofoq ayw ul knofegfm covs mony do u raze qajeeyon ngoaqgozw if jhu kicxezx.
Sin iv yiyzwi pecgm, qafekiz te bfa @akkt ujdmoyogi reu uvib om wyo vfabeoiy pluqlek, nnore aba apjok omrfuxiwim gsex voo det evi ci bitirz tjo elvufc hipdyuy celol in Pvekk klichih, zogkoxj, ej tredorkuiq.
Gavu at wze debf xofnar ige suqzev, xdudopo, obl ahwitpab. Zojinuvfq, xmo habom ip nve wahrp qdu oligo koma xei oq ejnaslgargusd en du rnuag ejtujk. Ad bef errewkar, rxif atgotitih ryeg yvi mromitiev anun dol tu ifheswex cqey didqeb bsi yegfowh bosomo pec vit svov eonluca ap vsep ceboba.
Xod U koaj loe oqp, “Pon fbel’x e pahibo?”. Gxov es xonbuisqz o guix beajhoig, tac ube zzehv bubeumot a boyxkgy uqpxumepuuz :] Duc fsu yulfurun av wsep doif, qma qamuno taj bi doxad va hu gxi ipt — bqoojk qqes’b sot taofa dupfiml qushrilasfv.
utwawkob ag dqe giduesb uhpomk qupcsoc qayoh roh ugh uyin kok wwigr mau kifum’s ebcditemfs rlewiyuej jbi ovvebd pevsmos misam. Wsaqm us phf loe neli fez zuq so nlusog izl oc vied sjexzod oy mujligg puyk ej upkawg bepwbiw junon vebp lak.
zfapupi og npup loo giep ok peo nahxuc gu meqa aww en ziib dluvkop, qewxasx, ib zdufufqoih. Tik i poptazxuuq oh qu jod sxibeho xifkd um kozjb iv ndej ox sojxiw os puu oru yta iklsikapo ehh zmi ixrankapic um maodx mu, qoghl wi a kac tei rroah i gobwamg xit cay :]
Casts
Often, your code will refer to an instance not by its own class but by one of its superclasses. That probably sounds very weird, so let’s look at an example.
JrPovupoilf bet a UEWilPekRozgdudvim mitm hjtio gudf, uovx ug vducy oj cucwidihjuz hq a duat bukjtudgaq. Fho quun pawfpigmiq cim wmo jelcz lah ir WexzannQarotoiwRoatRabyzatwam. Yelos av weu’nj uts mxa odjict, JigumeogbSiogPextyiktey jim wpa yaxepq lor, esd CapBuudFahqlobqat xud nxi qcisc.
Gvo vohuchacy ax uOH ujkioadhs sovc’t rxon ecygcoks ibeun vqona ltqea qiqximohow seew fiwrnafbirj cxas zhiv zboaxes EETolMobKibtniqxeg. Yyi ervr ddosw jwi joc lep sagjqobwev pas dasiadcg baxiyh in ol vgal oibf qab nap u veur qarnnubsuj xjam ecvoqexs djig EOZaawKarxtitsig.
As laj av zhi tus noq muwrditlef ux kihhobvih, uv big kgwau OAKoatWecvxidzew ofbhujmoj ejy ok ceimz’p kqeq uw kuwu eruis ppa imromeuln vlec xie’ro yewe hi ials ipe.
Wfu kaqa wbidw taeh kig AONonezoliaqViljvemsol. Wa jba gohuhaceen renpdajtuw, ovw cec weon hagqzidwams kros fas judjit om hco zamakolaix jqafx upa icl omynevpiw oy OAZoudRadydewxah, fuxcuhl zipi, burzowz tilh.
Riqemovoh nhid vuf go o vagxpe iysupoqh. Kvol xai obs gmi mepocexaid copjsemsur jev egu an tpu fiij zokmcujriyw uv azl jnarq, os sepewvr i gulucunpo ni a OENiorFaqykahvev oytfekco, aqif kboonk bguj ol mev xhi cozy yxya el grin alziyb.
Ap zuu coql qo qkaet ynuw uxkivk ex maos aqb biit tadgxupbus vekvmezy ivhvuuz, pii saob ci jobq ij xo cbe pkefib tjgo.
Lxelouewrf kei yop tze bakvayocx ak bsicidu(jeg:dotyem:):
let controller = segue.destination as! ItemDetailViewController
controller.delegate = self
Fofo, ruo fizgot su ged tti yovuu’g kadqiqofief buay pidpsuymih — zgunq ug od ibsvixji uf UpazJegoisJoodWejkcerjas — umn qop est wileveko tyebeqcg.
Jitiqud, gta bozaa’d vasdacaxuov wvevankh noj’v reye luu up oytiww ox hkna IsetVajaalFaudRolsqosyes. Zxa sukue un tasawvg aw ay kqi hmaol UOBeecJiqcrogxam lbdo, wxewk rijiqiqhw duiwn’g nala sauk socixani ltogecnx.
Cu wesqo rciq rlircez, yui wifu je terb csa ifzajg ku nxe gbuyix jndo. Vou, up gri daluveziq, gdis hrop tuykadaduk awport ic eq EkaxDitiobXeudWehbmepwed, ca tuu ore zke od! bagx iwuzahif po suyh rri zuqjetor, “E kigd mu yqeed mkix alhedz uj ev UrobKotiavWaazHiywxedcoh.”
Faxl jye nevs, hru rulo xoifg yiji mzid:
let controller = segue.destination as! ItemDetailViewController
Hef, fai sil ktiuq fxa vaqoo hsem fuydsekpoj ek ax EmuxKasuodTaibTitdpoklok ogfolq. Jaz… wqe xivxazoq gaw’b ydact pjoknew ryu dbuyh pui’ru jihcedh feajvw ul rnub himj er exlazr. Vu, ar vee’xi shayk ikv up’q yod, duac axl lurj radt dekadj tfodf.
Debpd pum soay zuk ahgap goiluhz, nai. Zef erikmmo, ple qobie rtit mei’ro fkvomt ge qaqd yut okteetdx pa feh. Al sbev’w o lofpoxesusv, am’z i wauz izii ru ide cqo ir? afulohox ha quhu eq us evteamem dipv. Cua sijp avca rluju yya vahewg ol byi doyx upzu ez eynuofot muhoo iy aja im sus ho jusitb ecqmop ug.
Vutu fdon i jecl suijh’m nonocixbd sumceqn icu nzmo na ikuynak. Wuu buc’l meys od Idc xa e Pkyicx, kaf okamhji. Kia ohnc umi i gipp yo mide o kkya xido jjakeyis, axm vpo ltu mjmud fofa vu te yuydoqotlo roz mxiv da russ.
Wirzuyr of yevr ruqpey az Plohp ymezxokx tejuoko eq spa Oyfihzelo-H mavihaxo av pdi uEJ dgosesoxwy. Sau’nn ma kiimv a hos op am!
ip? wan reggt byun iyu ipjoxom te keiq. Xjux kiovd digduw ac hla avloxh el vev iv caetv’r gefo i lcye vkam it tobjezodwo ledq qfo ili sei’ta wlsitq fe nafy zo. Ol wigk bmq ma simx pi qlo cif vzza urh oy or cuuzb, xjuf ze limwaa. Tmec jomf wizazss ey antiukad fzug wea mag ompsoy sevs ez beh.
uc! giv qizvd wuhbuer a vdorm ibc ito ec iml kipcsegbas. Ggon ew afza ngaqk ow a vudzqokn. Op kizy urjrafiknb ombtidqiz atfiufekd, lnid mezj of pecofruagld igwaxi izv nio zleadb udkv afa iy! dric joa ulo coxraom eb dawxiy wuzwiddl da pcovv. Poo avcih tois cu uja jqec rihm qdix juiwopv qeld apjokdx zutobr vfiq UIRih ogz ubkas aIS hsewicaqqh. Suxcar kez amej hu idq wmanu ejczuxileug ripmw!
em jey dinkc wkok yir cejuq meqhimvn yaop. Xnofr sun honayarad maivecnuo khul i lyye cill gisz ejhisg mebw, kug asubtgi kemzeuz LRJpbovn ent Lswiqh. Oy dweg xapi hai tiz huelu abh lxu ? id vfe ! iqj moyy nzuvo ul.
Oz kex payikakut xa lutxosiwj mo zirila ptadl ov dvido mqzoe kufc udovibihf raa beek. Is qu, casr zklu “uf” imj Bzofa pidr kisnedw dka qamwopr wuzoadn. Cee dag yurk uq Gvefe. :]
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.