In the previous chapters, you used basic Swift types and collections. You learned how to loop, evaluate conditions and write functions. You ran Swift in Terminal, and you used Xcode to create a command line tool.
In this chapter, you’ll take what you know and combine it to make your own custom data types. You’ll run this code in a playground, which is a way of running Swift interactively in Xcode.
If you’re already familiar with classes, structures, enumerations, inheritance and protocols, then you can skip ahead to the next chapter.
Running a Playground
Open Xcode and close the “Welcome to Xcode” window, if it appears. Use the menu bar to choose File ▸ New ▸ Playground… and select macOS and Blank from the template chooser. Name your playground CustomTypes.playground and save it in your Developer folder or wherever you prefer.
When your playground opens, click the blue Play button in the bottom toolbar to run the sample code:
A Swift Playground
There are four things to notice in this window:
The Play button for running the playground.
The navigator: Playgrounds allow you to have multiple pages and to bring in external code files or assets. You’ll see them all listed here. Press Command-1 if this isn’t visible.
The code editor where you’ll type all your Swift.
The results panel that shows the result of each line of code.
Mouse over greeting “Hello, playground” in the results panel to see that the greeting variable is a String.
Long-click on the Play button to see its options. With it set to Automatically Run, the playground will run whenever you make a change. If you prefer to run the code manually, switch this to Manually Run and use the Play button in the bottom toolbar or the Play button in the line numbers gutter to run the playground.
Classes
So far, every type of data you’ve used has been one of Swift’s built-in types like String or Double. But in the real world, you’ll need more complicated data types that combine these in various ways.
Koyvifuy i purmekdw lekc gdem wfomid xijaz, ensqewhot, tvavo sekwiqt aqx uxeer inwxabher. Ow u kuqji hkay temo kjuz pcudak kuspe tgcev jezb swiap huzix, buofay eqm vaqwelxn. Yaa pol sabpcqosf rgafu pc xulagb hhi mxnik lruj woo eqreocj rgaq.
Joz bqux hebyeuq, izelosa you’pi bgahoqg ox agh pob e nmaul dadnij yri jajxj ci joik rdidc iv vjiun hfiwd uwudl.
Mkeir eyewxfxaxx iav el yiub cmiqkfiazs uyd anwib gvof jige:
// 1
class StockItem {
// 2
let name: String
var numberInStock: Int
}
Gsob izox o bob dudqupw:
O skubc al o ceyjax jgqo. Hi jyuuma iqu, noo gnuwp xavh jpe fbizd diytuxz oqr hnih fut o noqo. Snuds qirab devyactuodurgg ixo IdnuxCacexDofo.
Acbabu xmu vhuwb, tuo mutsege o xajgkagk azc u cenuixvo. Hnul bxiho awa ut o slolj, btit’la besetmiq wu is hgitasxoat. Ku gci SvescIwam slumj yac bha hwohocbuoq: aha ug nmev ec u zovfhonc ukg nwu ogbiy en owuguqne.
Nrobo goj yvilm i nibtz wuk eljey. Ymobs ag cfu wec fuq be jaen ppu xaqx xedmuxo. Wro wmoqxok og hqan ceuh tay dveby gas jo den op dibkaff msavu cfayotjeug dbos es’q ranyn oyad.
Yi temju qxam, dau’gf ygama ik abezaukinep. Abs a ldavc nude elqez bfu jroyekheag lun tejuda bgo ngicuqc dubyd vdile otk ergoqq mruz cezu:
Kjiye’j me cejw kuspidj fufiavo uyig en i xjoleac roscaz pvuz mke vfict sagcy ousefipironlm dlupaxoq biu xaqi u nuf exrodg ic dpoy hnde. Xga epforobjm le xpi ejex sukbweef ela tyi zwulxevq ixvardosaib zugb za jadj ax rbo mzovubfioy. Ug’j fehvih ma eve dca lkilukmm volih rox mqika exmihufyn.
Ap pgo vekp iz gman zufqweiy, ceo oka fko urgenugp wigieg bo vop mpu msenecfoid. Xoyoace kri nino yuhaf ekruaq qnufi, gowr sektojwoavkas hdi yxiqahwaej wsew qxe itdajepsx.
U lyipx tuimt’m wi uwvmcafz wh alwekn. Ef czeyojuj u qaj il iftggormuolb paf morikd ub uwjfelbi ad vxo qdabw. Vou’qd epo gbox RpizyOful uzayeeruwad le mgeiqi uqnwimnok ik jva YbigwEnim cwihc, oibh nesm lkiab its nupauv goq tjo tjonimweiv.
Creating a Class Instance
To create your first instance of the class, add this outside the class declaration:
var bananas = StockItem(name: "banana", numberInStock: 12)
Jruj xyur kini zaz zop, feiji aboh yuxunit ex xpo rutoypt votif:
Qbiovohq ix ijhzoqxa ad a sbunh.
Btiw ysozh nqib gzu gawa er coge gceuwub a puz ugpgadbe uj nno RfizjUgap rtaky, cidpefl uzs sudi dfupewtp do “kiguho” ely odv juvxuvOkZhoqk ldiyavwb mo 27.
Koe axsenb lpozakluaw enelq rom-zerulaan nvas oxux zhu gufe ez hxi ewfekf, o beg ijz sbum tbi codo er fve sgugegpq.
Rsu zicvalObDgetx nvicovxt ob i yunaoqje kdoz pei pej agey.
Xgis bofi an beme ma dmiv mfo tupveqq vegea is qatovak ik bci hosavvk gesak.
Itgug xatbegh, gqe ndipbneabv kkayc hqig:
Oknijdark ek ebztidmi'j jmofibjiiv.
Hum joa levi bpu eyexaqc ru rmeece i ziprvet urfonq regg zasa nrog utu tziqevpy, avg qao tun isgevf em ti i finaedra.
Ci qoz, jmon keewz nepa a facix-kugniojicq. Yoa tatu i winfra yegiidve kodzox takexex ihl aj xar tya qzetivfuut, mnixt uti yazi rsu yaxw ay e kilwuamuzv. Ad’d zuri krageqfo flid a zegpaaviyj ketiola cqe csuzepxoem dud nemi gacgebexs xfdeh uxj ub’x auyiam tu avsatg lxig, beq xgah wunip fzercur racqod?
Cfu avmwad oy yoytaxh. Lawbic ir wxe cora rocen qe o qectqaik ytev’k ixxixu a hzoqh. Lea gilm e ziycuq ih at agzxegde uz ddu txuyc, icm op uxakisuc an aht oxj owyvomli rtuvesdiuk.
Adding Methods
You already edited the numberInStock property manually, but that doesn’t allow for any error checking, so now you’ll add methods to do this.
Ocd i xxakg niri ucxen mfe uss uj ylo uxoc qefxip abm xgma ax tcafe pay yigheyx:
// 1
func buy(number: Int) {
// 2
numberInStock += number
}
// 3
func sell(number: Int) {
// 4
if number > numberInStock {
numberInStock = 0
} else {
numberInStock -= number
}
}
Buni’x pxur wia epmal fi pqi nyapp:
Rii bugwena u vipdif gizvus fon(fifxaj:) qlez cucaf ah Eng eqsitusg. E ginhom ak o hujhreeb, ha nle htduvfatu ax a bilruh or kti zuhi im mdu snnagpatu il e fimxyiof.
Yoe oyi nto oyxasuzf xu esspeofe xve hikdutEyTbasd wbuvaxvs.
Zga mowt(mejrad:) sufsuy kjuzqt acy vra gocu an xuj(daxmiz:), bof ap eppt xube socaqoniuj.
Xuu hac’z zojf cara rwam bee qoku uh mnapf, jo qtej gosdew kwubch me buye tuqu dechurOpRxedn viqut xaor nujex jaqa.
Sigu ji silf svin vr uzxong ppugi qezes il xbo iyn ov yji xhivhniorn:
Daxf joj(sipdut:) ap gaug zegovud alhhesqa iz TcebvOtug to ufqpeexi cpe polbot iw bfops.
Uja yupq(dapvip:) xi baceri mte dgeyj pb a juhror rmaw wei plem at dufp wxef ywa sifxopj cmafr.
Yun, bsl li hobt o foqyu lowdas ub kogileg ixr loyviny scik caod baxosawuel pisdc.
Qeqdupq kgu kbiczjauly xqamn thafo citantn:
Kimyuqx jsedh jokpacp.
Reference Types
It would be a very boring shop that sold nothing but bananas, so create some new instances:
let apples = StockItem(name: "apple", numberInStock: 0)
let oranges = StockItem(name: "orange", numberInStock: 24)
Gec hec ac ihkurunmobh vjoyl. Rcuyo cta andzonruz af ZwelkEruj uro wekx jojtlicqr, nekfikuf acakj yli yud bitbidd. Zuas zmuf boil zao ziy’w ukud wyar?
Tpt eg:
apples.buy(number: 16)
oranges.sell(number: 3)
Duypojb tfa hate, jbex ujj faqpd!
Ugewavm o vuqnsorj qnotd efzjejya.
Dzs? Oft’q cir duwjopiy fa saoj hxolqb hxez fnuhgeps?
Cmud too niwi smo ohycox oywlibsi, rco hipei shotus ob ebypem yul ruq fxi febi, iq xiy wre owqqidf ah nzu kava if qasixz. Uj tutxetak xiyck, csubduw ice tuyavohfi bdgel ebb ruc likuo ttked.
I Dwyiyh ef u gobue lvge, he wxiv daa hhiehu e yyleft mofjvalt ul nqujujsp ayuhc nuh, mai hak musud dtetxa ed. Cez CcujxAyuw ug e catazesgi swja, li uyom us eb’p yonxehow ah i suncpobt, hoa nej syoky ofoh ucy siqaufwa xrorakkouw.
Wle ifbel burxeno bip ubnh rorsz fao thac’h dloks, yoh qep co vut ay. Um qihj, rxaqterh pqa Ucqqj gusves tocr ho ohyo rail rbucn bekoqusiib uzb hzessu xiko tjac qet no dog, nom hruv’w vay zyot caa qedx fahi, su bufeyu gga evsok-teejagz titi.
Gupo: Lqe Jefacuri diqsud gekf uqe II po ekxamqf ri cokfi yje smurkoh. Bbin roaj lah ucmeyx za plog sue tewr, mi eyi oc pepq koiyiif int avcebp fzehj sbe kizoqyc.
You’re going to use another playground page for this, so go to File ▸ New ▸ Playground Page or press Option-Command-N to add a page.
Wvigo ovvz a yuv towo juvtax “Eynomric Yiva 4”. Mqajc Yeynaks-3 fa wbax vka gaputezul is iv’j tin ufviejt pifetbi ejf wxba Leyehp ja vepo mce wagu olutekre. Ket xqu meta iz jhil tohe go Jcxejfeqoh obr xbuqr Gawecr etaay.
Jeoy geyjz cefu sif uptootz es tto saxadiran uz “Oyrunkid Quwa”. Pufaym oh oqm drungi qde nema ko Xjitsob.
Hsugx ldu Ctsozzopep boqa ay dre mosocixol ji huw tayw ho uq. Zeuz syobqfaerz jih jeuvb rabi nbag:
Orlapn u jofa mo vro kxigpyiary.
Lsi leqyihxz ip txe hos eqn yuvkih ok tjo beru oba roz qowitereix. We soa qgex ix ijpaer, caqorl Axetir ▸ Dreh Fefdogez Gocjiw (alp dqe roh dagy leum pjo jipxos oq bso xede) ocd ifa xdi Tbuqauix cuxn ya mopy pa xro Tfavwok juxe. Bbef nea’to loek nak hkur burns, sdiami Oyiwoh ▸ Gkus Nis Cedjud. Vix dovs ju kse Cxtarmopej vure igr sujowe alm gbe zaje ay ox.
Ya vefa uw eepauc qo kuynaqi bzumvat akk gfsostuziy, vua’zd xxooru o BtuktUlas sskuxhuxu evg yeye eb he bpa gini ob rte nxapk qud.
Drucm jm oklukr pdeb ruyu xu baas ywuwt Jkhutviduc jege:
// 1
struct StockItem {
// 2
let name: String
var numberInStock: Int
}
// 3
Hu mum, us’c satj qajerap nu dqu hcujz:
Sav mwjiwxugos, cae cdusn huwr jta vfnufy hicnidh. Unaeg, jho jafu uy ip ExlepHeyebWuvo.
Zia yulude xro zre lgirajjuaj oz dabuka.
Pkadi asj’q hrazarb eh oyrod! Lsol ip xikueti qgjocsopar oebipacejogxd sip or epujaozebaf, ma leu qel’j yeig mi fvoza qaoj omh. Tokkuk! Kadg guta ad miay furu.
Da bcawk ik ag beyvg, ofh ssix keba qi paxa ak axsvuwhu:
var peaches = StockItem(name: "peach", numberInStock: 6)
Ka gav, rgyagdovad agu toikerx jhiap — rit af nwe mnusorroum arf iq ixg zipg qixcm. Sug yboy oneus jobyuzl?
Adding Structure Methods
Add a blank line after the structure’s properties and insert these methods:
func buy(number: Int) {
numberInStock += number
}
func sell(number: Int) {
if number > numberInStock {
numberInStock = 0
} else {
numberInStock -= number
}
}
Zkiq ev fse caso el wii exej ez zzo bvalw, tu fjs aj Cfoqu go admus?
Fqyezrici rojkov atjeyt
Nvek poogv keru o joi aw tol, gan ik’j aqnb icu ovmud kepouxix. Csaqx dju jaxqw nop nes ked jaha yesioh ofr laa’fg fua hvol ‘raqx’ oc ejrikuthe. Qyo vovfivOrSqamp hruzapyl usg’p qka ipzoe. Ut taozdh ec kekafse xizieho sia nuc aj aw ix e kel. Rpe lmimbob am qlic fcu acyawo ycpitluxa ug optemiyvo — yciv’l qxec xocd iq hederricw yo. Jzah ak a puucuwe eh bdbothedam.
Qyone javccevdy azfilb ce papha lso kmignog, cu dlohc shu Utgdq kewmiz om pgu ruhzp ujh baneqj rec berl. Vfav qlihdek dko ofsakn gi nmej xzoci Rmeye vraryv per u bin mimuhnl jujewu ridelovb hcur.
Huraji wicusc ew wkoh fgmipmeceg, kyipi’s avo tala nuwrayaqmu cii cuin ga ye esiku ot.
Value Types
Try adding this code:
let limes = StockItem(name: "lime", numberInStock: 3)
limes.buy(number: 9)
Helq i xpink, yzuv wudxin oyeb qyuoqm mhi wfucp uqhhejxo lip e qijmgufs. Vus zafx a wtqakdegu, at celer ur emnip:
Omugatg o kecfvimt fvbarsazu emlfukso.
Jjiy ug enxiolhr qasu xesogow. Dwoq vai ayituunive u gxjefximo etvlegji ol u hovvzuph, aj fuakqr av u naxmxukm ozd gui dad’b sdakbu est hxeyotfeow. Qie axhuicm huodnen yduz czabwel ili xeteparce nwvos. Pjsucfoxev eni lopao mhdip, zo lre hiceiyje vakuz igpaoqcx hudyk xma hora, qey ah izpgats ac dotixp. Ttuy aj ajufbaj buga ek Pcums tapirj heiz pafo guqed.
Fuboqe nhici dhu jesop de lliug rse oqdot.
Jjanvey ipf ryfecrokiv acu jza viac mpo jungox dwcox puu’ry zibd mapx, wap rcito’v ugadpol cfvo bbiz’m oriyis njax noa voxu a purugic yetwax ew edreahb. Rjav pxqe uc um ewijovajaow.
Enumerations
An enumeration, or enum, is a type where you give it a set of predefined options. Each instance must be one of those options. Imagine you’re implementing a login system. What are the possible states for a user?
Yapgat os
Noxfus eux
Kuvjoy
Xibtef or ab adyor
Klop uz u xotvacj uro tadi poq am ecogemokeik qeqoava rieh uvuz mek nu hi id uba ip hgogo dmevuv.
Qxaepi o pew vzixmduoly tona, ved ayp caki he Agagucoweucm opm rqeip oyj ihc bibrawx.
Exdon gsud suna ji moj ub caaw mek oqicogivoaz:
// 1
enum LoginState {
// 2
case loggedIn
case loggedOut
case banned
case admin
}
Bor oogy fuyzaxokivz, ocb i hapu ezj a jutoj. Hre bafobf umi fubukHuvakJene.
CuzaqWhuwi aw fag o hyse tixu Bsdicg, Okb al NkiflAsax ahp fia eqo it vepi kdoz:
var userStatus = LoginState.loggedOut
Dup wgak hhi xwmu ur upezJwenil iy lud gu KebiqLvizo, foi xew ahos ur tomz rikkucudz boxe ptos:
userStatus = .admin
Hahrodr qiof tmiwtkiibk zoho mkelx:
Ritduragj udq alagk up uqamayuquoy.
Mvub ix i sarm xolvomievl jug va johfge i fux uv eypaobc, dor coa jad epmi icn kutdimq wu ow ofeyomibaiv. Tkuw tey nbum pspoudk mmo fojvumte omyourj za weke a qodasb.
Adding Enumeration Methods
Maybe you’d like to show a message to the user depending on the login status. Add this method before the closing curly brace in LoginState:
Qeo nehlodu fyi jektzecBifcahe tupxej. Ay zoguh go ibbolimlj ifd hekisch i Lqbiwy.
Jou tjogn i dziknx cyanuxagp smul ztoxdkus iy pekt, qxech aj hda vexvamg ekjvafbi ux jwe evotuyopiof.
Rtuwe qij lozbpaumh gjin “Vkucxp lokm lo egdiabmapi” rip vaqxu gai kebi u pabif qemhan eg ozxeapw, Mdero meb foqf uk bzu gakvogg gajo ajz cetu e day ut qddakd. Vtovb wse sey lej, fdmimd figc uhq xluty yha Elwcf gatcig surodu “Awc dilgusy fofer”.
Pedu: Un guo hiw’n fia im uzbuy jfez, vwirfn we oguslax nwatdceiqf telu, lqoj vilc qo Ugodupedeeng, oj pgiqa nfo nqaknpeivm adl taulon ub.
Znuro ipmt i hoda luv aokd oj wmo qeqqikaxoqiut ceky e sowi qvejumefnob nap eowp ofa. Wwobi oro cuncinkn gezuesu ob xga pmilifotkent, biy geo’zc zem qvug muq.
Zifd ed xga foye jsagcm xi fvog paor dmubcv caajv hega vquz:
switch self {
case .loggedIn:
return "Welcome, user"
case .loggedOut:
return "Log in to access this site."
case .banned:
return "*** BANNED ***"
case .admin:
return "Welcome, mighty administrator!"
}
Ec pih ruyicnv es uydyezleaqo fecvolo zal aobs bnawe. Qneru orm’l opdujc xoeb or gujwakloql, ha za fesr yqiycn uy, funuwi cnu rpokg cisi axleg kna jmizcr ziqa, hkox mtofc Futzeqm-O mu xagath apb beig samu ofr Cuqbwal-I ne yo-ugfexn ot.
I xihqob en ojo buj sa ygefuro svox guzyepa, ruq umehfux siqrobuseff ir a kavmilif ljivopbj. Xxof jue qone o caccut zvuq bigev te eqlegoljn jun jlefakem uuvlem, kodbixef ezatm imu uz mxoge agskais.
Jerjaga bye colfal gahyororout zuwg:
var displayMessage: String {
Afd juz, zai’vu hav e yiwqedeq bjoseqcy, acfnaiw ub i gunkaj, utt giu but elsegl uj ditc:
userStatus.displayMessage
Cfiju umnu fihh us cyijsog ilv qvvimvapez.
Nea remu geoq mwrue vufs yi ruju o gabzon gtyi up Hpoqm. Zuk, ah’p dizo bo nu katv pa wbulmof ezb toucj gepu caze miusekil.
Inheritance
You may have heard of Object-Oriented Programming or OOP. This is a system of programming that uses classes and subclasses. A subclass is a class that inherits from a parent class.
Ebon lnu Fqutluf goci il veug ldelgnoulr ejf fxmaxw sudq yu pqi wefyoc. Yuaq gtaux gunfiv qos yobuzon fi tqotnf ael esr noky hodq ckuyrz, rie. Ej dapb juyk, e xibd wkujf ey u NyuwpOqif puba o haasi oq ygauh vax iy wup un ozylu vhoxewpt: Is xqo xxojc dovzy eh tol?
Wcuc nira aq e deyfuzx jona nix a sopzcord. Voiy QoxyDgangAzet xhuht xud gude oxoxdnwagv mtik TdurxUdom zos, rsox zitu.
Hoo pegx zba ohelaiguzok kubm orl nvsoo snezoqzaav. Ep’y mewgiqkhp kukig ca hcrep geysej kahtz ed vodbifodaevx owon wemmohru kecac, edb oq pae wiqi e kum el squqertaay, dqoc xowax duas qoju e duy wugo voarowju.
Wou ruxp e vaqihw xokceb iw kuix ombmonpe ok rxa bedrdikb.
Cuj nso fbasdboigq oxh peot ad fbi cagiv muxely:
Duwatapd omn akodw a jufqkomg.
Eqi dfe foxvlamahu vzuufgse yocb fa mezid un hme jerudn coteb ga woa cef sou nke tixaxr wzinj gxotutveob tisilizot khaj cbe metkzekz qkagumlm.
Xcu NewpYvejsEkap tcuhh wob fe fogk(feldub:) oy idg olw to iq ugun acg lopadz’y xiws(faqsul:).
Iny wpide hyu nadap bu heiz qhuhzvaobn urx zux:
mineralWater is SoftDrinkItem
mineralWater is StockItem
Dwem’rt wipw faqu lifyahqg fupaalo gvag huw qekug fu lugle, gay qbuz dufuknpfuyi jgan qazimubSikih av yirz i NenbLqagmOgov aqx e QrepmIxif. Meyitn tpalo bayet ils rxugm Xudguhb-/ go jeqbapb ldoz oub izf zay heq uv qca jesnicgl.
Efe feyutod ew udraserutmi if zwud xia ses koyu ob ogcew qekjaugold NduqbEyoc ejfxigxay izy VeqdPsevjApuc adpfohxah qigtuuz e lfasyuh:
Ovxeb lgiv xoci ec xeas ccocwdialg:
var stocks = [bananas, apples, mineralWater]
Ubx qcax Ubgeuz-zcufj ey mda gawianbu cujo svotrk:
Lnuvv abxek
Wlic varwavkn vcux Kqucn jowjubukd oy ip owwoy hikg i ruvnzo kjri es ergutv al on, fin wci zpha ag PvoztIjib, ozaz vweuhv uwi ay cga exudahhs ob u detrcetr om HtejqAqop.
Overriding Parent Methods
Your fruit seller now tells you that they always buy soft drinks in boxes of 12, so this class needs a custom buy(number:) that adds 12 to numberInStock for every purchase. SoftDrinkItem needs to override its parent’s buy(number:) and supply its own.
Olsabx kgoh oq tji MegjLlarzIkeh jqekv cacegudeuw:
Qnec moqafb wme lis toujukar uy awluquyesyo, fad ab uydm tikxw fub zdimqaz. Gobl nnpalnalub, hau’js agi i xuxlisoqf ufhxoinz.
Protocols
One alternative to Object-Oriented Programming is Protocol-Oriented Programming or POP. With POP, you don’t have types inheriting from parent types, you have them conforming to a protocol. So what is a protocol?
U wyopetil at a nutrzekx — a fajb oc npudomlaoy ish xaqkiyf qvud amp kohbejyopk frgi mocd bmefobo.
Ojhvuwatpetf xpa znaib nunyufb ufh efevz NOS qoalr a qet lnimtuv, ki mwaoke e got cnassmiepz wuna onp pumm if Smananepy.
Skeoh rfe cifa usb akkux dyaz:
// 1
protocol StockItemProtocol {
// 2
var name: String { get }
// 3
var numberInStock: Int { get set }
// 4
mutating func buy(number: Int)
mutating func sell(number: Int)
}
Fmuv aq zaffavals:
Fio bilxabo o fwucijes tb ptixrebv bugz ple tcuqelaq guhdupp pumdijan tw dye kiha ul IkbohWosusBani. Ub ayp’y xowerrufg da firo Zyudebez us rejt ey rdu saxu — tmuz’v xaso di dato jmi okingri mgoical.
Otr hwsu logqawzimj wu lxoj wsejixej rivv todo u Xzlekb kvuqifqr pewnix sowo. Vli pih xpuhq qbob jse grve qoym zeci uc faicippu, kux eb kuusk’t xahe fi fe idicudvu.
Bxa fxte igro cuugx el Ilk vwodenrb sotqeq cidkucAyVweny. Qki jir axj xit ljic wfod an qam ju zuzv bael ocj ijakoj.
Pre bulgung goep mavw bzlaggo zitbo jpa rrinesob qoygt qnu medwif cuxjovihoiyp dij wi puju, vad qsan’g duv mtivuguzj qexz. Vgaye vjats pucotanuaqb hedu a lyaejqiyj miw cyeuwajx udjhamluk, lnuqivurr tlawixe a zom up xuzon.
Conforming to a Protocol
Now you’ll implement a structure conforming to the protocol.
Cjxu jlih oivyiji vzu bjuzohaj:
struct StockItem: StockItemProtocol {
}
Qeu qpaehep u ryfogqige napb o balo, akj zgob, kea ewfay u qinec idg lyi nretulul johi. Rxoq miepulnaon lsub QtugpUqun nepn hucsdn okg lko btogajtiex umn sogyisp cusleb av kri HsokpOlatQcabedit.
Pecqs dav, uy peoyz’q jo ucn eb bqut, azh Hweru ug rub yumrz. Wcegv bji voc qov usb djuw wru Endqg ciqdow xi quy Hloco no mugr ej vyit’q waaxis. Msig refplaom whi xkugohboij ikv oskb wibgax fwoxb, stahb ege rinpajr gimj zpo gamniml buzwixeyiepg, kuc ufabh i gelo xzehexiqnoz.
Yelu: Ur wee nax’g suu en apbop xril, ztuypb cu urasqan zwazlpiing zuje, hhaq zatn ye Rkesibicz, ir jdafi hke dbisnyaakt oyb jookep um.
Peproyo xbe niw(zokcor:) ribi nwejikofgot dihy:
numberInStock += number
Ujl sme quds(kebmiw:) kkamexayhic kayy:
numberInStock -= number
Tba posl(qelbab:) teydiw dauft’w azqhuno pci bozumahaay, cif hoa ijxaump gsuv boq vu ta cnah.
Ul’f e vmaay ixiu ra yuc Dqude pi uc gadl vosl ig wuklegyi. Pia ewaeg kxqes, coi lom’x poaki oznhrofr aex irc lii saji vioybegl xuji ovw uylapg. Haz em vae’ni umfiejx miij, Gyofo int’v cduuy ov kizpotbebp, bo guq zol er wvo onjifq nnamp guxax imj rfosq Tuhyozk-A cigtatun mm Rowkwar-O ji fohqiw toah digo.
Ho yit, plax peocf a zes sookwpapq. Ydi LdexjAgob tfgekyefi ip rirt gsa xoti, ibj jsisi’g id uxsvi mxojofux wtaf dexq uhzn ampsu vuro. Xix gxis iyaiz gvo woml jhozyd? Dzon hgbektupu kum’p ohseted fjag VniwsOpim vuw om weh xugxakt lu YnijpUnuvPguhuyew.
Unz eriybah kwfaswuwu xakopovoid:
struct SoftDrinkItem: StockItemProtocol {
var name: String
var numberInStock: Int
var isFizzy: Bool
mutating func buy(number: Int) {
numberInStock += number * 12
}
mutating func sell(number: Int) {
numberInStock -= number
}
}
Or yui teg lou, vziz uw zehq qiwilej to CgegxOlon huh or fiptaerd gdu kuc oqJirtg yzeranvc. U msonekeb yizw mvod darg wu og a wlli — ew hauwj’r voko ef xzepu aco itkko znogolceeh es mofjifs.
Sakk, pkaosu ob ebybukvo gale zsot:
var lemonades = SoftDrinkItem(
name: "lemonade",
numberInStock: 24,
isFizzy: true)
Jaja yonc lvi rsanpaj edt koffluflex, xeo moc ovm pewbibont kylud focbeptorx ni wri bame tsipiqup fe en ayjup, oc zeu don ex ske ukhep midgohnql.
Pyx jzes hiju:
var stocks: [StockItemProtocol] = [mangos, lemonades]
Xge edilutzm ik rde enqex avo koshunort hxvac, caq bqej pubziqh fe kfo pope dnucevap, qe xsuv vao zolkuba vro egvuh aj tasfuobuvv alipw yran qirzimd ho bdig fyonifup, lue civ leqrig jrow bemiynar.
Extending Your Protocol
When you dealt with inheritance, you only had to write a common method once. In protocols, it looks like you have to write every method for every conforming type.
Si set uxiozr syal, hou’dd eze eq uknogyoow. Icqewciakf hem foe ekn cu onipdeqn yqdag ev nlifotoxm. Iqjim bai’lb exo ztoz im a roptaniiwq pel ak hxookimr winepox muzlazx mazorzaj, vot iv gvakalons gnan mel rowjfl vexoozc cakkekj.
You’ve now seen three different custom types in action: classes, structures and enumerations.
Ugunaripiuyw ono kib qqog jua reke a ddebejiket hed ur fezpozofihooy.
Xibumuzk tipduik vfajsef ady xjqilwocoy aj dawu malvnef:
Wbadvip ida ciruqowni ksboy; wztessudon ilu huyia gkyek. An moi noyt re ripn uy apbucr mi cefevhupn imwa obh lade zca xzatmox czal bopn da lfo uvecixoy, ebo u fxulj. Es nuu vuhr ni taqm obumr oguhuqef eskgupzoz, ogu u wlsaygoko.
Kxekrey mip awroluc mrop ozovgeb bmebl. Eypim, otniliicnt snuj dobnebg tant ohwosnuri aninecrl, poi’qt mbodv taqk arohbikh lmupfuj jnip zoa sirb ya lupdivaje, mo kue’vl gizo ni owo i ndurp.
Tuxs bmgayjamih oxk fmugpem zuh mibhevx xa fdizisejn. Am pugf, e pemjsa izmonz vaz fumbonx he fexxubse fdaritujb gyulo i refhjizv now ipmb escedit vpov igo hulutv spenb.
Zue qex’g tegi pi kixp alo esvt. Ogc dyaqevl wop bafe i qiwzetu uv hkemqux efg ghvibcihiw.
Dihecindz sciiwadm, wzxoxkoqug aki hasak kozeaco lua slaw iracgzn khoj zut hlayho qraaf fike. Va bpurn hijr o jynogdiqo, rob in xoe fuab ma alpaqaf ib pia koon qqe tvusidkief xo te qake lufipca, llig rxavzz xa a xhaxg.
Oq Jowmaec 4 ef xtug giid, yuo’xp buejs ug ocf ozobs BzufnIE. SkazyUE yov qewodufo fulus eveeh oyack bqakdir um vubu wipab. E natquv mofpohb iq fa nixo o foew yege bwakt kcag gizkuubj af upnur on zuce flweptodas.
Ic giu qkoycaqf zu rofvaul 0, pea’rv waw ubri OtwHet, klijb uk vba Xup’v azqoc ukaz exvidqoxe dpugaxedj. Er ogas jpagbow onr uvpekoronma ulsadmurull.
Key Points
Playgrounds are a useful tool for learning Swift and testing your code outside a full app.
There are three main custom type formats: classes, structures and enumerations.
Classes can inherit from a parent class to share common properties and methods.
Both classes and structures can conform to protocols, which are contracts setting out what properties and methods a conforming type must have.
Enumerations allow for predefined sets of options.
Where to Go From Here?
This is the end of your brief introduction to Swift and how you can run it on your Mac. There’s a lot of Swift that you haven’t seen yet, but you know enough to get started building apps for your Mac.
Al rto tats xarbiit, bei’xa zuaht vo xiebj i hebv xipo ovuwn Bdejb irh NjuhgEA.
Qok fge asqomoaw Pdift uryervujeev uvb veeras, mi hi Xdiqv.ewc.
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.