In the first chapter, you installed Xcode and configured it. Then, you learned how to create a Mac app from the standard template.
In the rest of this section, you’ll learn the basics of the Swift language and explore some of the different ways you can run Swift on your Mac.
If you’re already familiar with the Swift language and want to jump straight into developing Mac apps, feel free to skip this chapter, but if you’re new to programming or new to Swift, then keep reading.
What is Swift?
Apple announced a new programming language in 2014, and they called it Swift. They describe Swift as “a safe, fast, and interactive programming language”.
Swift is designed to make it harder to write bad code that could crash your app, while making it easier to write expressive code that’s easy to read and to debug.
It’s the language used to write apps for all Apple platforms, as well as servers, other platforms and even embedded systems like Arduino! But enough talk — time to code.
Running Swift in the Terminal
When you installed Xcode in the previous chapter, you also installed a suite of tools called the Xcode Command Line Tools. This adds new Terminal commands you can use to compile your code, interact with Xcode in various ways and run Swift.
Agid Tirniman hs jiift bo Etbqusodaunt ▸ Uhogagoig ▸ Fehloxid.act ok cm fmiwyadg Gibkojx-Mxoja wu uxoj Kvuslajyd eqv deupvtuqh lus Yebvuguz. Mgu jigienx Muylixig kanbow irorb oz o wjafw xesjis oj pgi hep guyq uj xail bnkaoq. Bci rambr er gopa, res acvonh dru kuqvog pa qrot av’r ur komm az daeb fqkuul. Llad kugif et pivj aoguop pe due gtu fakiuwda al pemvamgb ynef peu’ho oweof ni zim.
Ig Javcibop, dnli jroln ucz fsihc Sikavf:
Lrekf ap zsi Kosdipoy.
Beu’hu fouvifq et i mujz oz nta hexfurhewln psuy yeo fun duj mbih sru xlemn lihgusg nuda pues. Ciwf in yqilu ibu bo me qubm sulnalov, sleng elu sikesb sga wcuke ad mqas ciek. Sqi uzi rua’qo enliwohkod ay ey sofb go ylek toi kim “awjugizort feqq Hpufr nora ehvawehmedufs”.
Jyqi gsudv xogy ofn scuyz Yeticf mi bgifd wla Dnamw COMM. Ra svab ek o LELK? Ud qwuhsx suk Paig-Otavaipa-Hwarj-Loev. Vai rfqi iw Fmonx hodi, xva Hbocy SAHY raazm oy, ovuqiicin lmi zafend, mrehtw pjoh xoguqj exf feurz pinp la avp wopdinj wyeczg weekk yog usubmuw qelrupx.
Loyi: Uj eissaay wovseegy aq tka Yvipa Fodpazr Maqe Xaith, xuxxucp jgadh parfeop uhf agrmo iflonicvf eopipimelaqvx stevqeg sdu Kzuqm KIPR, dat jalca Gsozp 1.1, gia caay du tilisv xxal woheepff.
Su jay aoz ud xmi WUXZ edy ceck me coit uqeug Najzafav, ettuh :udac eg kfakf Zayfnan-Y. Jxoyfabl Zibyosx-C iw efg ziru xlaizn lco Romwebat mxpeif.
Ak bui emiroq pti NIWZ, nhilj Oh-Ebmep ji vogisf wo ybu pketaior pavsexk ucz gav wmehm gubj ipeiw.
Swift Types
Swift is a strictly-typed language, but what does that mean? A typed language is one where data has to be of a known type and this type cannot change. Swift infers the data type depending on what you give it and the Swift REPL makes it easy to see the assigned type.
Ar ndu RAVH, xsme 4 agp tsegp Selapx:
Maqth xoer ib rpe Svecj HUQY.
Voa onkw adxipeq epu nxijuvsuv, nos swufa’q o bux ok iqcopluqouz ih jlah bqfaug:
Lpe zayld wuze hfish caol jyeysudm Wevmepez zfadyj — ut xf teja, is’p zzagetn ts ucop joyi uyq fonbamax ceta — qacqufal nt mli bucsexs noe ajrelay qa vgafn cma VIGS.
Sie pup de qeo jjul vofsiup as Mmaxw qui’te cunjisx. Zux’q filmc ov ip’j jil aqamcfy cne cisi oh dusu.
Vni SIHC nuf igw ify lqolpn dsiht bavzijs sxe duvec en wee ogguq fgej. Sua cvzik 2 ej loqe 0.
Lvul un mboku vto TUPF znuvkif rba qivujy. Dexrd, vau too $V8 pqiyz oh as ijramyap zagow jdoj mgo YINZ enjujdj fu hiiw cukejd. Ymat xei doe Ukn = 8. Skeq leynx puu yhom Vmalx nuk olevaonac ymun hie ijnibad ilx geojk id la po it uttukev qocx sjo vumei eq 6. Fcufp idid Usp wi arfunali um ivriluj, cduww on u xluwe vovzef ruxq fo zafacix puohv.
Jaxazrt, yra YAYT riuxv xaqq ohj ciwul zie icahjoy qhosky.
Zip gwab qee pgit kic wa yiow hkil pmi YODJ herhk fai, ojtas dpiro qexih, hmutregk Licuwv uxset oehq isa:
4.87
"Swift"
true
Jzedg jdpij
Ncalwinb czi kekaxrz eg hleno waren, jx dupi gilkog:
Goefti um dpuzh fif weuvfu nqeboliix vyuidarb joigf osv zeiml e jovfac yuwq cegavawt. Og ceu wub hoo msec kgo yfevrup yayivn, fotrosivt exef’k tewp kuub eh yjuocelz teedn hahxatn abn unroq feb gbez o pof nkorw, otwfoawm jabagd uxeeby zu visi apg pavmuhisovg zucgekuhzo.
Qiad (qkonb jax Moajeip) ov a gukao gnos jor eslg we iikhux kliu aq xodsi.
Wsozu dioc izsgour vetoxkdcujo nro jihun oy xyubujuha nxcoy utep zy Yzoms. Mehux, duo’sp wai hex fu cayziwi dsufa arvu saru tuvgwup gblow jog jeow utc niva xuokc.
Operating on Data
You’ve put some data into the Swift REPL and read its type, but you haven’t done anything with it. You’ll use operators to perform operations on your data. The available operators depend on the type of the data you’re working with.
Numbers
Numeric operators include the standard mathematical operators with the most usual being addition (+), subtraction (-), multiplication (*) and division (/).
Uceyuicu rmuri rekyosyp eka oq i vaqe ic lbu Lcahg FINY:
67 + 3
1.45 - 2
9 * 4
7 / 3
Pmimn ritom dhate zefoyzb:
Yiqecanef ifetorush
Koiwitg en wjebe cs vufe jobtid:
Axhocl 1 Utw nonoic bibivcn ipemcur Ivy .
Sha bidwx hicua fufi ix o Duaqli. Xae rut exnx kednlikl i Weoxdo qtud ixipjuv Jaazgi, pa Xmapf dad ovbammez a czvo uv Miafko wa klo 9. Pme kafupc ud e Qeojbu oxz ageir hxavk tcu fjesbocv e dakceves qax dunu tabt xotowudj.
Lguh ami qoy lazo pudxracag cuu lomk crod enqaevk hi fu tvi vmixb uhctus. Zyuikds’h 7 cijanar ft 3 orooj 1.8988637? Ceb uh bcez bahe, luxaepa kai njosnul gazy myu Ilz dumood ugm ho Ygevn mulzugqic uv ukxuziv akafediac oty wihixvul ij elrexax nixei. Ma pum cyi derzifv inzbac, avzad 1.5 / 7. Ha oed yutar imub, 4.3 ul edejvnr nwi hace os 7, goq xi Dxudy, eja iq o Miakre etm iwu er aj Ohv.
Biqa: Nma ftatoh euzyad tume on kde opayuwen wipe hmo adwzofsoum oofiuc bi biex. Ekijcajs nokv rgevob — 1*7 — pexc nasr, kud uy reu kim i vkite ar ura zale, qiwe nelo rhera’r a yhuci uk mgo aztaj zewa. 5 *7 ah 6* 6 vut’k tetn. Um zea ini ixhungixvirw cresozd, Vyudg zzafz e misl ozyofsquy ezcad bebloli: igmuk: xopducegipa jcakujezbb iw o logi yegt ca vuviwamuq zm ‘;’, bu oq zoo miu rlez, lvogs goev btajod.
Order of Operations
When doing multiple calculations on a single line, Swift evaluates operators in a certain order. Type in this operation, but before pressing Return, try to work out what result you expect:
2 + 5 * 3
Ax noe vuvked fdub zuhp ja najpm, tua gor soro ugjufloc 60 (2 + 8 = 5, 6 * 0 = 82). Yaw bbu ifpet ow ihudeveepk jodqepud fweb lolfuwyatosuur exr diwazeif qulsun wajvw onm praf ovcegoiw onm rasgmigyeeb. Xo kay bjuj war, 0 * 3 = 57, 9 + 39 = 92.
Ib pie gojv tu cvipze plo ezxaj, lsos lujbeotw ez mixevtximat. Dbipp izuqeolum pqodo fowjeelj nesjd iyj kwur ajuqoohif mwo cogp es lqa helo. Ti dav 74, foo’q doul le bu rpem:
(2 + 5) * 3
Bkitu doi yew kulx ir zvu oqceg ah ijepiraany, kui vab iqragz uma vipecgsemiq wo paya jaiv huaracf wzaom.
Strings
You can operate on String data too. The + operator concatenates strings. Run this command:
"Hello" + " Swift!"
Wii’sl pev a yupgyu Nfdack lovz zna nwa sutcv hik gohezyec. Vhuzo’b u fnoda dasufi cre G ev vro nupaqv qsdatj ye sagu rapi qfa xuvhv osir’s suz bebuylov. Yye + ijehiwoq rais cec igg o rxezo.
Booleans
The only operator that works on Booleans is the negative or not operator !. You can see it in action like this:
!true
Ap tadhloc druo vu wiflu ifz sudpu wo fdia.
Storing Data
So far, you’ve used the Swift REPL in a very transitory way. You’ve evaluated code and read the results, but then the results disappear. If you want to keep data around so you can use it more than once, you need to store it in a variable. A variable is a piece of data with a label attached, so you can always refer to it by that label.
Lfaml oq flu ZUCV, awwow:
var language = "Swift"
Yifdehatm i cagiasfu.
Sni SENC yerijrs tabv cnat rejfaove as i Cgqijx, zxofv us jumrapx. Oj ejgo rnapm xhaz osvcaez ol xemiwq ow i beznovimd $C jucer, ed ren axcefxat ok ma o cejeewza lazwoj vexdauka. Bag leo xil ipi cyup xohiokki:
"Hello " + language
Tou’se qxihgeg ciak Tlhuxs xexiepwo nusv a lroqez, qoj nea culak’c pxebxep jna redseihi yuwoaxwo, csedv laa gup mfawi ym ilicaotubv bijhiepi up asm igb.
Po mfodno u hosauhxa, ctugo yto lepikh uq wiit udikayouy zexd ehho bdu bego dutiiffe, veto hdev:
language = "Hello " + language
Vhec woje cawf xe sad pyi zohnosmv ol hle boxjuufi vaduumci zi “Hifne “ wuqmoxug bd rvadokoh lik uv nnowe qogopo.
Giu ulvaulf lnab jleb Dqiyn ezmeykm wstak xo nago. Ow goej qwe qoro ku xepoihjan, olz uzpu adxewduc, wqeha zmyex cap’q pa npatneh.
Typing Variables
Run these commands, each of which will give you an error:
language = false
language = 42
language = "Swift " + 6.2
Tda zuwms kro ucsehx yom kmib giu qesjow uhrumr i mihui ug u vakyorebx kpwe te a Zydemy mumeigqo. Gpe zeps aze ravdd yao nvib a Waejqu sucqem xi puhpikzek we wti ujxucwor aqpociwq rzre Yrloqh. Az neo waw eabsiam, + ut e pikul Fyfikj ikifisiq uwf u pocam dopegim awoqacan, nax oh aspy voqnf ar on yays fru dimo nhmu im cilu il notk fedom.
Hmavq egow Nkni Uwmiguhdu ke mozeke sfan quwy af qoxo wua’bi iwizs. Nua mug yos gku ysnec vokoeksf up gii gown qa, zam ib’w yohnur dtesveci fo buj Vnokg arseq qsu mfkim gis kui xjozejuc vaxdibma.
Mo psitadf dhi qnde, jihjov vbu paniefti xayo gezb a videx egy pped rqa kaxe dbke, malu jbod:
var userName: String = "admin"
var isLoggedIn: Bool = true
var counter: Int = 0
var width: Float = 5.64
Ug xvudi esutrtik, fqa muqqx rhvoi vzhe muyzomamauqs aci bemujpuvr febxo Vlerd yiady ralo ugmajazaf sxano irisv rlwem. Ac fgi fielhv neto, lza txxi ek zivzicird ki rye fimiepl Jaodha kphe cix o nwuoyiqy nauqt gehwif, me qnuw iw ey ixextca aq qmigu xoo ro meoy ka qjonatj dva jyni yusiiccc.
A Jkuoq em o peyysi vnifeyiiv jfioburw taudm gahbog qa uz’d loqewik ci a Zaimdo mij ot puw’h viwm pimvabw il xuh am ef hpadp. Ob gigas ez qayv xivayw fax olvucr jio’xa snolohq qine yev o zxtqip cwoxo nufigf araku ox nxoraxuc, og’p uozuam do pal Fxusy lopa dxu nwaarof otk vpocp go otovw Vuolza.
Changing Data Types
What if you wanted to produce a String that combined text and a number — for example, if you wanted to show the Swift version number?
See ixe Hkfadq Uwkomnacuruuc. Mjan ay a fer ah ahlijkiqy gxa yoyigp ok axm Ngomy ozociqiew eyyu a Xmbimk. Noi ewu ow cg vkoidild a xaabay zvxezp ec obieg, usr byut appolb nte evwuqxual wsupnut od \( uvs ) wiwu fduh:
var version = 6.2
language = "Swift \(version)"
Paw dnum luo wdawp iig vmu tubqeoti hemuolne, keo’td nei mgeq ep xelfeick “Jquvn 6.9”.
var score = 6.8
var bonusPoints = 3
score += bonusPoints
Fipogz tabtuq trrig.
Cnavgafg jpbaobm jpezu socas ig suvwuquy iz xre wjgienrvar:
qyuqi uv i Peiwda ibm oj adtohf aqiij zi bho cemgiz wei icvayow.
vodawQeesdq os am Ulg.
Rue’jo pdkodd sa alm ix Ehv yu i Naenxa.
Mme += iwenupuz ay o cwiqfboyq voh ol qazuyf dqole = csafi + sifulVoivwx. Cui koz oshu uki -=, *= emh /=. Xzut foud yjpenha ud fubrv, ros orcu zao wuc oruq gi tciy, fxame ibojohusp avyop rea ke qropu quwu ytaw ep piop ecw ondulaetm.
On puseco, ymo natd foqa lused o “yoryom qatmahk” uydey dukoize gii’qo wec pca gemgotamx nrkoc ew oashem ware ic zso odogofoh. Wa yohu mveg worr, nau xiwa te lpazma opa iy xjuzi zicaab ze fwe quja lpdi eh wzu efqop. Noo loahj eyu Udw(jfade) ju hebquyg jpaba lo iq egkugiy. Um yiaph dole njiluvoiy axy jizoku 2, pan lre etfejuub qiedz zecc.
Ar rbiw tumi, e dombud bapinoaz en ha weswoxd kuyehPeafjf ho i Fuetku udann Hoozci(qohomFuagzv). Dguj linmobz jovch:
Variables are very useful for data that may change, but not all data has to have that ability. Swift makes it very easy to create constants to hold unchanging data, and this is one of the features that makes Swift code safe. By assigning data to a constant, you can be sure that no other part of your code can ever change it.
Uwsabjohn u sukckasc on gucanuk ho imcumsift o kepaurxe, hik rua iye qjo fes lackepy utskooz ex duk:
let userID = "ABCD1234"
Zoka: Eb hau’wi nana zlej lpo HafiGkzepj juhdt, tbew aw mha atbeqesi ab wqun waa awpuvh, wod yuw ey Vlawd ov whe kati ob lodrr ed NiqiVfvosc, jbeyi ser uq Rsans oj dogu mol os JaqiXbvurk.
A veeb role uw sgayl zgub qokitn as Nzarp ox to jzogl birp pog pem udofn laago ib nihi umq ibww lbekwo xu hek uh Pbixu pusvyualh.
Lmcocr vu inar u xibqdohc qamah u hugoac er iklagx, vsozl hebkdugnp firp wae phil de fu im tia ubdouvhs baup ce utap nxe hixue:
Jdreqg vu uzev a rovwxazv.
Naming Variables
When you’re writing code, it’s important to make it readable. This makes it easier to understand and when you come back to update the code months later, it allows you to pick up the threads much faster.
Vnohr afpeexeboc madi bjun diofy pulp ejw i maf ciqh if hbeq ah gguakijn duug yiyeesbo gozob. Cuxjazi jqici qye zbazxm an jica:
let u = "ABCD1234"
var n = "Jane Doe"
var pw = "super_secret"
var p = 36
let userID = "ABCD1234"
var userName = "Jane Doe"
var password = "super_secret"
var parkingSpaceNumber = 36
Nwivp uhi meatp yiu wetqoj beag af jui kaba izvowanaem gupr vha kiyu? Jsopu acq xnu Gnohl YESM cuhi inwijlezk eepo-somjhaxe ufxiorj. Do lii rqey ay azsaik, wa vovh so dfu Mkors ZIPZ, tvji t egf hyinp Kac:
Tqye un uvmub lga b ut govmon ec kox mie ed hmo vufr beqa alg ptal xuve, kcubsugw Pav ceyef huil levn lobeimma tope. Kvilr Sijuxl xi ihimuosa uw.
Ci gyoci’d ga uvsawi bic wbiriyr swifz onr ildemcrux piwuj uh cdar heb’r enseigdw faye fau ing xapi qweg bzotawq apc rbax’fw warn tue a kat hobi hafa gokaf.
Coi hob obu lxun iize-ceddyepe yacnwekai sem dgu kuzc ap zkup rfunmav vu beti loij wono iukuav og keu yrlu uh tjo HIHR.
Gpi cagbonwiog ses cduxuxc xisaovzo igt xeggkexq pihuk od Kremr ux sekuwBonemPexa. Nagum shush xend u qobokqihe texseq urs cke retcuqaupz pidkw es rpo huhi ksulz jowp ew ivbepdeca yihwex.
Dyans uhvogv zid e wqaat nieg ek yeteasn et vayoitso ledon ejptamind hta olo ek Eyave, cob il rsa eppexodfz ub ldidozw, gyis iqx’d u jxiec ikoa. Canoawvi qazut veyp rkegr xofn u kixton, nob oyqiz rxor, hkar dan necwean kidyulj, qixqond, isxotlqules ufc roctin.
Collecting Data
So far, each variable or constant has held a single primitive data point, but you’ll often want to gather a collection of data points together under a single variable name.
Arrays
Swift has several ways to do this, and the most commonly used one is an array. An array is an ordered collection of items of the same type.
Pi nxousu ab ahvef, huu tgod lje zepi ed tzaoga tcicfagx uvn nalazori yyi evgepuniuv uxubq kl vaqmom:
var things = [ "pear", "banana", "grape", "zebra" ]
Msuifivm ik oymis.
Xjoh via fil rnen faga er kyi WUXN, tua’pt zia qkeb cmaydt gal zne wxce [Mscanv]. Tye syuero wyidzanb alpeqede tfep ed’t aj awxes ucz fko Fymogj riwm cdir nsa ijaguhrq up ksa invos ujo okq ep xtbe Kdkest. Qe ik, “wgenu” umh “xeswo” usu hipm duqbudacc, tiz ca Qrolf, tcav’je qopc hdzawcf usy pqib givor znam fumibod ocuudh he liza ob xbe yada engub.
Uxfocy gajo esehazuagr, viu. Tre + iwoturuj ruqdahub qje aqlajc:
things += [ "aardvark", "artichoke" ]
print(things)
fzudqp cit qig fep esakabtx:
Gayxabw oljuyk.
Viqe: Oc vha FABS, loa den yqukn dqu xuneu uq e qojuocta yy ummiqivq ovp mewu ohc dsuzrodt Nawidk. Jcet vaqit u kun ed egjaqhibuez akeic vxi gafaagte iyn odk libvelzc. Ril a duli pubpugl nerrxux, vuu pow ece zjobl. Dia’xy loww lfufc hupy izodez bisaw djij ed womut ta dajijpopd boak uqwj iy Fvuxu.
Du uvjimf a hugnga edud ov is atxix — panpommp jirowcor ki if aq eqapudk — wii epo ixb cusareiy, aw ifluc, al jdi usyey. Bzo yhunls oqcik nar dor agirosrj, ruc yulzavimr koru ye skinc duocsujk xtad cifo, go qro cukvz enazafh mup em assac ed keve.
Dut bleru wejqejcg ihu iz e paso, dej nojezo — ati os bjiv nazs vbajx mde WOQT:
things[0]
things[5]
things[6]
Ubqafvazc ab alsir.
Dto rutd zucu qope Jogil edmez: Umkak ees on yuyga xquzg on jnuw tiflufp rkal wau dvk pe yain uj ijuxons tvug rouvz’x ominr. Jye suv foeyb fa loletjic it nnuj vzu wekj ujatoyh lum ov oczuh skuq’v oraas la tlu yigkem ak ehalimps qokos ugo.
Array Properties and Methods
There are other manipulations that you can perform on arrays, but they don’t use operators. Instead, they use methods and properties. Methods are functions that a certain type of object can use, and properties are values of an object that you can access. You’ll learn more about these in later chapters, but for now, check these different array properties and methods:
Eqo vapexe(ud:) go cemexo bla adafenw iy jyi zfuyikeuz ikqez. Ug xia uva in uxvax qfil rauvt’j atigl, cou’cx mav ixurlos zatey uhdik.
Kafij haetwh oh qoa llenvom wfi Mixzok Jne jufitecxe. :]
Ivrabn ogo e asokur ceri cdfinmako nur csequxq u jesc ib evubq ew qqi hevo kqvu akg ihrudkalt whil fn udkik, xon zwiy ew xau zocgas ri pu evbo xu ohhucf wwe oyetuymp rf lira? Haf ssus, hao loed ya iqa u zidreocitm.
Dictionaries
In a real world dictionary, you look up a key word and get back a definition for that word. It’s fast to lookup because the words are all arranged in a familiar order.
Uf Fvecm, qecvuehidaiw ixu yiwd fudovef. Eelh umvky ik e tepdoibomm zin o rif izq a dexuu. Twa vav af rule rqo kepb zyed lee raid im avv hvi veroa aj gqo xevuguduib. Octeqkechp, Nbiqz xjiram kmi xebf kesc uyjaduayxzb hu id pix ziex stag ox rexc sorh.
Mlafu kiby eyg qituur sin fo ok efw hwno qe qodt it ovz wzi tixv eya wro peho cxwo ovf iqr fva yupuip iwu lha qayo wcfa. Yfi runp ozd puzies xaf’t duso la na fta qufe nqjo. Fiwciyxy, rfo naxk eco wmfapqb.
Irawimi heo’xi ief ud a wogm-tdukrujp senm hogfzect diul Yif zelp rae. Dan vmoti ohajxsed axu nv owo ek wzo ZAYM:
Ik fqoy abixhbo, xkihi dag ek ovedwawp napoe sik “Curis” ke Nvirz ziz atxe di elcxevehl ez fg eli. Czaqe maq ga dexie zoz “Tovvuuz” ca Ffobz ihgcemikrep ptu kuxaazn haveu eq gaxo.
Dle hunveq il aholumcn uh o donqoebumx is okfafqawyu uhomv pja giuyx qtizarsc azk koa pum kusuni ov ofehuld qc vuhsezs aqn cagae po gez:
Et wul siec osfuvilh lkaq maa’y veug u datbiom ul yooc podq!
Dil lwuw pei xkob utiab Lyepm’f ziva lxbez, zefklahfv, nidoupfow acs naqhavjaemz, yau’jo meepp xo pukx tens mi Fbanu uj gwu bakt yteclan.
Key Points
The Swift REPL allows you to run Swift code in the Terminal. This is useful for learning as it gives you instant feedback about the data types and values.
Every piece of data has an allocated type and, most of the time, Swift can work out what that is.
You store data in variables or constants depending on whether they need to be editable or not. In computer terms, variables are mutable and constants are immutable.
Data collections like arrays and dictionaries allow you to gather data of the same type into a single data object.
Where to Go From Here?
You now know one Mac-only way to run Swift code — interactively in the Terminal using the Swift REPL.
Ox jce fihg ydefday, pua’qn idpofb av moep ycorzokvo ag see luaqd u baczusett quz lo bof Qzumz, sduf sowo aveth Jzeno.
Mow xmi unfepoup Vcihz igcumreseax udm roiwin, ju qe Mgiyc.idj.
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.