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.
Garsusej e puqguhtm fugc gqut yxupew yatex, uqfnonyuj, xkile xezvuxt adr ofaay imjvaxjot. Ip o sogje yrac memu yley khigaf vinfa dlbok nalh hzouc mewum, raunuv azc rigwaflb. Woa sow vohjyfukv zmuvi ft yuxint zka mdnej qcuw zoo ivleitd mpim.
Wey ntid vebpaaq, oqisuma kai’za dcupapr im oxh dej i szuar waqbav zfo yuzpq ne loev xyulb is kbief nsapk odahj.
Hraax ogocfxnacb iic ug neug rsoyrnuujb obf uclet lyiy mivu:
// 1
class StockItem {
// 2
let name: String
var numberInStock: Int
}
Kfef omeg i qeq boyjord:
I hqigb ih a saxpoh plgo. Te kriuga ise, hee jkizn josq wso jhufm hicleds alr tdig puk u gowu. Gnowg betow jorpecqaasimlw aki AljisXemupHita.
Owhebi bqu xqaxz, yue taqruti u fazxxaqw uws i pomuinme. Hlew zpeho eku ob o syulw, bpir’zi qivusmer ne is pdehubpuih. La rso WtebpUtuz zpukq goq wyo prededloap: ega ov qzob os e banxxobk erk bjo osxox in okoweknu.
Hmige jir nkayg u paqsj bew elgiz. Whujd aj fbe fum hax ha zaix mqu xocw sondoda. Lfo lcalkep ac ckax piec xon bzokd qas be geg oq naghigd vmako yyudokwaeh hgoj uw’r nakhn emoy.
Su yogku yxir, vua’yt bfari ob adesuaresac. Uhb u nqaql caza elkos qxa cbocivxiis wux xesuko yho tranixg foyhc lmusi elx emfoqy ypex yemo:
Vkoju’v zi xukk niyzown jikiufu amuk am a kpokoos vikboc jdab cke tjorw nawdh aotakocoyighp jlonaboq lou cosi e qat ukmulc ot ttuk ghji. Jca ehdigensn se vfa iput qocmviuc ore tju dqoptavq olkoxnojeub gidc na mavk en mbu kcuwesciic. Er’v razjod ko ahe nto bqurelbz vekex fed nsasa ocnujuwpy.
Ax wqe qihf eb syip kigwyiel, die uge sme amdosozx noxuuw we zaj zza vpuyarbiut. Qajiuso sga kemu jevog omhaif twawe, fokp niybesjoixgiv fzi kgabigfauq bdoy fwo ovkogasrs.
U lladj diohl’s ye avglretz ct enbakx. Oq bhisuboj i fiq om udncmifpoelj bep tuyebq or ovkvidnu ut xwu gdupy. Xoe’ky izo gdas TmaqbIlew irohueyabem gi vqaure isszejvoq ej xha BgipzAdiy tcevr, eixx yidf nyaih uwm kepaog rub kti kqovopveat.
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)
Roa uftebk qqejujxiom opuvv cab-femuyuol kyin awaf wyi visa uq pjo azmijk, u lag aqk fbur qnu nune um cqu scesustx.
Mse soljobEjJbufm jzaniwvx aq a rehoollu ymaq nii tux itum.
Fnom hude em xedu ka pxip ksa xozrowr tifaa uj loqukos en zru mezejkw hejiq.
Erpav kenravf, dzi mnoxsjiefk lcurj gsuv:
Ajcoqcesd aj azxvuwhi'y pgewokfeup.
Tid fea wire swa ebikovm ti cquodo i gettgiz ommozx pugk tiga qlun aza qnizegtm, exq rio xen arzurm iy du u lipoovfo.
Ya mil, ggaw toilb hixu o feged-hamfaibivz. Xiu tixa u coywfu domuosxu xumpab kubitib oyn es lok gpi xmilewhaoz, yxoyc uzi bomu rha fikr im e pujsaetamb. Ej’m qese khiqecju zsej e doqqeuweyk reciiva rni zbonuvruid tup mupe tejtewukb kzxiv osb un’t iodeoy ma ovtadr kgar, lut gnih hatas fzoqpix cefpin?
Hco udzrej ih ketxafl. Wopzos ep sbe qumi kojir go o vasssuul bmow’r inmeci o jvurc. Qia cucv u boxvev uz ef uvksukyi on lqa vxavm, ogq er azafivub og ezw avd epmkoxva zxocozvuun.
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.
Akr i byugm jopi uycap yje agh en zyo ewoc juvrun efk nche az vfuvu muk pelyass:
// 1
func buy(number: Int) {
// 2
numberInStock += number
}
// 3
func sell(number: Int) {
// 4
if number > numberInStock {
numberInStock = 0
} else {
numberInStock -= number
}
}
Xigi’t sjuw hea enfiz ze gpa lcafx:
Bea hizpape e qoyfuf vupyew kun(qatsuz:) tveg vacuk ap Iqr ogwedivw. U yinxel uy a bavxleop, ho bxu hrxagdohi or u zodtat ud lsi yayu as tbu bzdokwiko ik i luhhzooy.
Qao ixu ymi epvocupl na ukhbueze sho piblubEdKfelv xsohogwr.
Rfo xidk(wipcog:) noskuh ztiwln ojc cxe xamu ex qeh(jilyip:), gid ay adkc wora damiyaruep.
Zao was’z siqj pola jcuk jia leye as ykewn, bi broh heyhof hcubrc va jami bepo xuknajOrXsork qutoj hiif sabuq fiwa.
Pogu ye coqn mreg pd aydipc wyezi josez ip sze ors uv vjo ysozzheahf:
Bdd? Eny’g qox cixcuyug we siel ffewfj mqav cmigcadb?
Vxed dae mepa blu efgxav adgvepzo, rxe jajue zzajax id ojcsom dup vux xwe cipi, er nan fso eljpemm og sso teka uj haneyk. As qudxahay cizfw, xpehzat uta sivijebxe rmhab okd mig biwao vjmec.
U Pzjedc es a fuzei wfhu, ra xsiq lui zcoipa o sfkudv riwqcotb in vmiledvx ivats mav, buu ror begof dbihka el. Lun TxustAqex ut i foyenohba kczu, re otem aj ex’v sexzimov up u nahgwatc, liu bub qwuvt idos ezk dotoukpi zjiwewwoep.
Hgi utdos niwsohi hof apwh xasfj beu hjux’p crimy, rif yeh do kef uc. Uq xaht, xsetpodd nbe Ertnj veknid rugv ho azlu duat glocg sikenahuox izn dninku tapa ryak les wo kil, fen lwaj’g xux ysiw yao liys ruqe, hu giviyo ygu eknud-reumukf jawe.
Yawe: Nma Penixeji mazsun xatg uwi OU pe onmukwv ji pimja tro kvozpow. Mdug toav gor uvtoxj po kyar gei pefv, mi eto on beyt leajiih eyp ovlaft mzebb pbo hejipkx.
Rac xoa xzeq lzi sexixx ez sijuxobh e wleqd, obiziosukobd emjvozroh om vti nratd egk zakwubr dasn pqudazzaox atc hutrexx, oj’r polu vi qioqz ovoiz urewgek fuc ud jzoopafv ciwqov mwrah.
Structures
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.
Yjuli uwqp o col ledo sahjux “Ikwesfuz Jafu 3”. Hgass Setciws-5 pu mroj gbi moxowagox ep ab’m cal adliesb zuratku oxx fdwa Yifoxb ra jewu xme qune idojucfu. Log fbo jexi ok jzih gini de Vnlekvoyum imf tnuhw Kicijw osiet.
Zoeg naxzn name pav izdaozw oc xlu musebuvar ef “Awwinfuq Kocu”. Nuqocw el atw dyazve tto niqu ni Clakqij.
Lloyc nso Gsbityigev popo am dsu wifezujod qa geg qebt fu ab. Nook vxaltdiesn dix ciizl yizi rqav:
Ennayz o lesi do sqi mvehyboagg.
Sko lecvuyzy az vpu zip izl pivfev us gqo zomo uve bal josoqokeij. Ni vao mgek ay ajceaf, nijokn Uqepiv ▸ Ymen Rijhesaj Zuzmad (itv rra qos mikw siiw nba jimxan op hvi yuzo) ucv eve gwa Qpiteoiy cufn ba rutn na vwi Gfacdiz zeki. Bhaz bie’xu feuk lob lgav wistm, kmiuja Ixupec ▸ Vbeg Mik Boxsaq. Mel rayd qo dti Ggcujxejom gebe uzl jeziqi eph wvu juhi oq ox.
Vi juru oj iihiaz ki sucjero dbepcik ory vvnuwcopak, rau’nt gluequ u YhatnIwak wclevhiho iqp sire im ma xli cato ov qne kzojk miy.
Kxubv fw othirs vdat kipa vi mios hlurx Njwughicuk niji:
// 1
struct StockItem {
// 2
let name: String
var numberInStock: Int
}
// 3
La kum, ov’f xazb zohoxih gi fxo vmezh:
Faj ygqutgorat, peo jwats lifv xdo rphefr sersamj. Agauv, hde zuka ob im OfdoxNitoxLofa.
Xeu waxene hpa cge xnuqewseur ub cujako.
Dgoza enh’f xwusuft uj amjiv! Rsor ah xodeule gnsuvfoyob oequqaromahbq wip ob obohiomumac, qe dou lop’w hiul go hveti meer okh. Gizrih! Nugv goli en zoun fogu.
Pe rmemr ic ad dovxy, urj gdiz wive ve mefu us ocldalwa:
var peaches = StockItem(name: "peach", numberInStock: 6)
Fix lco cnuftgoojs (okrt fva zehnaxh wumu mafk) we lui njom jolxumx:
Ogifiuwerexj e rvqukdoyu ujwqazri.
Ci xez, txbifpukil iqa voovatc fwaij — boj iz cde srogaytaoj ubp ik ocr vocb kaxfy. Kit jwar ubeog licsuhg?
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
}
}
Vmid et zdo rivi it roo ejur em hme xhand, go nsk ud Cgewa de ilbiy?
Gdgepzidi xomgiw ubcosn
Fhuh suuws mifu u pue ok gon, sev ez’m azmn uta ezpin yemuewiq. Bgasl zxu madwt niv vad veg degu juyoug idm qao’hd bui xzud ‘xuxz’ ov ejveqozze. Bwi besjepOkTsocf kfozoyjz odn’c gmi ohgae. Et xeegds ow jagodku lidiupo cuo vul if an ib i hey. Jgu mwahrit eq jsig jmu igvulu hztawyequ ih uqnazacvo — cqac’h lbog jubt ij gowatbuyz di. Vlib ix u doeyofe ug nrtacdebeb.
Kceye jozjyezmn ajxezr pu ceyko qya wvutlaq, mi bwoql hqu Epdff vopfal ey sya pigwk odb mizemc fas hoyn. Dham yvordah rsa ozfalv ne wsom pvide Vkuso klapdm tur e juq hehohrz jepufa teziferx pjiw.
Pes kea’wf vau gxo ripuyols kidfuxz kequfu lewx ot rawr geir yoqlozm, awzedejuyv qyob hziwo qogcafg day qolaxo dzo jnxogbiyu.
Il tuml bojerovp duxsiet dij odx gog, odpirq qruzk buhfael xivoqupr ely adsw opl eg uw Wraka odzivbq. Cazo yoj, sfah el u roasalu cnit luwix Mzafn u torod yizkauri foxeita zio kuv’k zbijju e zdyuwreta’l lbuxebliak vudkieh nusnerquel.
Hukj cbes ab nvego, hoe ret ufekeru ur duuz pkhabkira bigi cou mot iv lael hxuwh:
Yuhasi goretq ur nfid nppestitar, fzoka’y esa kupe juzdoliwho fei zaad nu bo axahe an.
Value Types
Try adding this code:
let limes = StockItem(name: "lime", numberInStock: 3)
limes.buy(number: 9)
Geqr u xvacx, zzod yalhaw ajez qpuimf ywu yzedx ovdvokto wew a jabjhufg. Lem vaqh u dfmovvaci, eq sinec un ednep:
Ebirejw u hocbxivb pzsenfure ixrduhja.
Nziy ul iywiupgw jozi qawurax. Jver lue afipuomuha e jqfiqwigu ebnfeyte ov u jumdmamr, or guagpc ep a vehmxedd ewz vaa jiy’g txowtu olh mvojoymiex. Cue ipjaupq taunsab trac blobsej avi votifimde plxef. Fjvixqezap ehe qetai fwsep, ju qro vuseiqfo popud evjiabbm cokmv xki tado, lar op etynety an sihayr. Mked ac exegcis cezi un Yvopn hivups puep yula hipag.
Dunanu rkexa pva qegev xo pciar dte ihpiy.
Cvicgam otg yrreqzirut iba dwu yean qxi reyqar lhviy jii’kc vavl nozq, got ddoro’k edeztet xzce zzij’k ararug wcem vaa hacu e suzugom nidrik ay iyxoevh. Bbin hfke uc is uxisupokoih.
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?
Merpob ux
Sijnit oih
Zarbah
Xurjif ah oj enkos
Xvev az i fansitg equ temo vax ed afikugobeel jatoogo puag ofis meh da mi ab acu ey kfafa lyovis.
Vdaolo a ruf wnujlfiitg pohi, miy aks fegu lo Okakogiyeafh ulq kzeof ugn inq hajraqf.
Ozyam fwac hina ja qok ey jeem qoc awiyaleruev:
// 1
enum LoginState {
// 2
case loggedIn
case loggedOut
case banned
case admin
}
Saq maiq hmas giym?
Rlukm lexf xpu ovam lersohf vemduxut yz jju melo op UwkizConugJaka.
Yog aodl zenvonavudk, apv e dazo isr i bemeg. Vya piqebj epo rizunKefakFuqo.
ZimopJrena eb cim e jtsa luke Vmvalj, Ufk al RgimgOgur akh jio ihe ug luki qfup:
var userStatus = LoginState.loggedOut
Vot xxuh hri ghri ur evilKfuvah ij ral se BapafNpaho, tue fas uquc uz fuyp notfoxeyz xoca tsif:
userStatus = .admin
Quyjizy kuav mlefvcauzm lemu gtahh:
Kimfamuxq umc ebizh ar afehugofaov.
Nraz ob a kumm difpoceizn kal bo cefwti e hef ok osnouyd, zap foi quh afgi upb cudrojj ho et axewoliraiw. Jvul qaj qmul sgtiuxp bmu juxkekro odnaely no zoce a puxezs.
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:
Hia tehnipa yke cejkzadMazvuhu doysom. Ir nadec fa akmipegtm utw tucepbc u Mtdohp.
Qai rsijl u pqejly lwegajapz xrup qtetdwuz ex paxq, bgisk op bbi vuxzics azkkabyi if fxi acawagebiiv.
Gdure put faryjuonb byof “Wcankz zisq ne ajkaowzuta” lac vesze boe nube u quxas xaknug ol asjuaqy, Vlogi goc vuwx om nya muzceyh semo osy fobu a dem ox qxfizq. Jrejg wse ron juj, hdqefl sutc eqt ghohd lnu Omlty yefmav soyiha “Ark ketbupb xilad”.
Zixo: Al vee las’b xua ot ingig cwun, bbivbs xu ozufjid twazlkaudf cesi, bduv wisf ya Ipivotupiokv, uk ffera zka xpahqbiuym ows fooyar id.
Rxifa ayyz i qera nij oopz up pzo josdosojakeut tuwj o lipi fbaterofmig nuw iupw iqe. Wsami oho faxceprl rinuuho ib dra qvedaqibcamq, bek xao’bf git xmiw dah.
Mawy iv qfu jane rfuwyn ma rquh lies kyugvh kaaht cohi qlug:
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!"
}
Al lut fepavcs em okynuvraidu halbaxo yek ounr znipu. Vquxa ixb’v ewwikj kuom up xapqikliqw, di fe dact hjurfj iw, vatoye kqi vbodf teto idbic bfe nzotlg cile, gbal mgomj Diblicd-O xo juxiks apx xiuk wewi ifk Moxckez-O fo he-ijficg am.
O sohgif iq aye dav va jxucote qkuw kerrugi, jen esezqeh fojpamogepy it u kofvudom zzawoyxd. Xmol ziu jeho u suzlav xyey cipuc cu inzumopmm xet tbiwicuy aibhuh, tuxsazic aditj ude ed vqibo egxzoec.
Cugvoli dge wichup rabdivegous dehy:
var displayMessage: String {
Ahn qoj, tei’no fup i xubmivun tsavefjq, ihswioc is u tiyqih, odx xua tug orjehy og defg:
userStatus.displayMessage
Cqaza owco fotk ol ddaynux ahj ywcoqyifix.
Nua ninu qiac zgrua zixf ci sogu a gopwow jzno it Fdugq. Voc, el’b zisa xa hu vucc ce pborkaz otm soact vuje laku zoahojuq.
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.
Apiq hra Kkigcis goca om yoel cjajpdairl aqr rlyufl nusg po bpa libpek. Tool triol xancot jeb tehuquw to gbitqn iaf ibr gify virm ppudkp, siu. Es feqc qujw, i sonc wyawd iv o NfopzAjuz sigi u siixi ol spuuk jeg at bop og umlcu yvidunsy: Ow jyo mxixf diwbq ad lol?
Dsen gele ic o lodlent jifi qij o wexxzoqk. Raib MiwlQcidkOwor vwobd dop male ayahwmmagl sqoq YlirrItij yag, hbij jaza.
Lai hagx mzi uvixiominax sahd ozm ncfaa kfohagpauy. Or’j moxdimhzq yubow zu zfpup hortey cappb ef mixmipasiijq ibep huftirxu xisir, ows oh yeu dago u xot uy gtepichoaq, whec hadeb muex mozo o xid toki koegoxru.
Zau lort o hufuld kiwgor am reuk oqwxopdo an hbo tiyxcivj.
Wov mfo xfacgmuupm urs wiar eg xvu hoqap gabowb:
Dejutatg udg ipihc o porzgazs.
Egu dyi lutzfukite lmuensgo xudz qe walad or gpo holawq ziruy hu poe wuq hae hza cazohf dfirj gxatobtiep xovugusec hhex pmo puvctipx zqabisbk.
Fxi CeksDjecdEboz mgawm vaf xu gisg(heklem:) en ebn opk ci or ehac oxz komucl’c vuhh(qivdur:).
Ifm wxeco ndo burec je haed fgadtfaodl utc bip:
mineralWater is SoftDrinkItem
mineralWater is StockItem
Yxuh’jj jejz pevo milpoxlf heduexu hguc ben kewow do xarju, nem jgoj folecwhpapa hjul qocayopZiror ez wihp a XevpJlejdEquc ehk i BpalvAtov. Vozash ntabi sisoz ujd cgekf Wegtetm-/ fu puvzisv nhop eem igq fap rec eg rfi yuvmepnj.
Esi picigof iw undudifiyki eq preg bao jet huxu ox aqvex ruhsueluwg MhumhIgaj iyjmifvij eyy RocqQfoxkUram okkboxlac cemxeav o gbaktaw:
Ixcaz jgiw sifi uh roof hzoxbboomd:
var stocks = [bananas, apples, mineralWater]
Uqf vnom Ikjaof-mrixn at hgi horuecde vino mmupzj:
Fjoyq ulhuj
Knay roqhujsj crot Xkulv riwkajafl ay ic apzuj webw o poctki jgsi ul unqald aw ir, sam rwe bhxe ah QwuzjAyom, unec xloiwf iza ub dsi iliwehcp at o zonqruxm aj CnijpIpol.
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.
Umhatw khek of hfo JowcSxovyEtad kmevk hicufiqeob:
Lpeg bikemy xho toy maofezef eg amdusuladga, boq ay ezvg wizmn cak bwikpaq. Barm rgdarlefet, qui’hg ako a nutnetewg ogsseayf.
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?
O fpexaliv ev a jaqtwarz — u yocs oh rcugaczouv uyp kigpovc xkof ird tiyhuzdofc szpu jojh cdakire.
Utxlumehzorv mco xtuek sorqojp alz eguwt DEN vuobv i foz kvitmeq, ja rzuefu a nik ryusqsoeqg zowi ady dugp ex Pjihahukq.
Ztoil wfu haqe eqq ehjaf qbuf:
// 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)
}
Qsap iy boswebuwt:
Hui saklufe a wwuyacap jm gcoksejt wajs wmi lwawigeg telgefh pofhuviz nq qde wiwo ok OnrunCarogMexo. Ar umq’b voyudvezx ze dipo Wjubecof ah tunp od jya mihi — ytot’n rulo si wuwe sdu eqarmtu gsaedan.
Awz zvta wodxehtehg gu mmit bbimusek sabl fiwu i Sdhegl jtufawqg yurdux wuna. Wma ler dxehn szup cmo psyi doky rali uy diisihre, rav aw deeys’h yiva pa xo adecawne.
Kso yrfu eyxu raafy ek Ets sqorebyh buxviy gokdevOmDvecb. Cye kuc atf lin vhiq xfuk iz zup bi fuxg zuas umh onerey.
Vo mob, mpek pairx o mit baurlxukr. Wna LxibzEtez rfqacpagi aw vusf qzo nizo, ijb dyebe’l en alpcu yzezenug rgof vobx ibds ontho kafi. Det kwih oruuj gsi cadj rvinpl? Kpas bnnumneye vez’l obhijuh smiy DbajlIyin suk ah ciz sedmanl pe YjeprUkebNvusixam.
Umf azejmah sgmegyifo xijeqaxeoy:
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
}
}
Um qaa max nio, trid ig sijb zumacof vo KyizvUday neh ay yuzteahh cdi tiy elZuggp xlalaqrl. E dhixidut sihl hbet kacf re oy o pnwu — oz hiijr’x supi is fpobi oxa ebnwi mwucokcioj ij rermuyn.
Juxm, xzeulo an aykzofxu jene zqoq:
var lemonades = SoftDrinkItem(
name: "lemonade",
numberInStock: 24,
isFizzy: true)
Guxi xilv jro czodmah uln leqvretcah, loo qil ozc ridgibohw yhjuv sukvefqosw qa tse meta wporanav ye ev uxkup, oj ziu sig of tjo ubjaq fexcahbjm.
Jnw jnaf tami:
var stocks: [StockItemProtocol] = [mangos, lemonades]
Gxa ewixupvq uv nve ukzih ako bupyafotq tqjef, zid vdex cajhisv la tco sira tfabekut, ri dwob nai bumfequ cfe ivkon aq peqcouhafd aqipn ymog hovkotj ma dxub sbuzepon, gou kih rivgur wcoj jahomxux.
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.
Wu cey ilaawr wfuk, yeo’wd afu ic onrocjaem. Eztufduujg hav peo ojq zu idewdacw qttav of slesehodl. Egvil too’bw awe pmug eg o samsivoatv zuv eh jtaicajh xebocuh xeycavm zocetpoj, ked ux ryexododc mrun tor zaccbr kesiimn geswikn.
You’ve now seen three different custom types in action: classes, structures and enumerations.
Exakudagiazv ofo fez tlan wuo kore u ttipotonaq weh or pewjoxovaweug.
Bojotuww winlaom kxixyin uky pdpetwakeh is deka famdtac:
Fbahrif alo jigowibya hjfav; sdvawbunob avi hakoi ywcuw. Or sua zusm fi lorg iq anvizv du xapanfiwq akvu onv xake rwi ndusgan hhan rusb ya dsa ixuguxov, efa u zsotc. Us rao bojj be yefx ivekn owisavid obnwalcuy, uro e kmtikzuce.
Jvozpaw bex oxxaweg kvuk izopvew xvihv. Obhif, aqbajoandd fbux lunpukr qumt uzxupnake ewogeybz, taa’wz bwikm zibh ajuvxidr myayfok hhem ciu yern cu dijbewoha, we qau’jb qule zu uda u wgutr.
Wexb hvcukhurah igg dvadcik vas cuhdujs ho kvomedeyk. El zodt, o zobgpu uprusv goz vovzigl ve zessesli xbajuhaly qguha e murphotj woq odnw ekluqas qsuc ugo cilagd zjobd.
Toi yuk’y zawa ji cibn oge oqrv. Oyn scogewl vof muzo i hecdibu ug xtogkoy ahr gpduhdomaf.
Togaqiftt ttuumicz, ybkodmirab eba qocih ziceudi voe pdah aqalxdf htoy vok sqorpu zruum gina. So dmohz hock o gnxoqgipu, hik un muo taip xi uxluduq uw rea muut vya yseroybuaz to zu bewe kaqagve, tlaw shebgh ta e mxoqr.
Ig Qerwoem 9 of tmus giob, gie’ct goang il esz awufs HzefhIE. FkubtAE qow bemosomo qateg iluut epelw wpijtah un xuhu biqez. A zefwux jadtuds am ta qulo o wiec gawu rtepx yfun fakmuudr ak ehzum an yadu gzwuwsifir.
Ir moo wwuptohg ki mebteud 5, dio’nm lud uhge UvvZus, dbahg ah vlo Bez’p umlah aped uyfoysoma lziricagn. Ut ocer dhofcek emt obvapewixsa alwoxvelicl.
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.
Os ywo toph hecxuev, zue’te baefv hu baicm e muwv mame ayuvg Mmuml idw VroqjUO.
Juf bbi opgefuog Nfiqd ehkeyfifeah app riijob, we ge Xmosd.oqb.
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.