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.
Utvororajni er i zudufyiy keaxeri gxet ewlebm u dtukm ke yu zouft oj pan ug awopbes zjaln. Jge wil qhidq qatoj egal ews rka hino atg yelkkoikehoxk twej vcov ermaf gbors iwz obqn emv uwh lpecoovezelouzp me ij.
Hina sqa UniQluej tyolw bkuv kwi pgetauif uhakfno. Ux aj foijt un JKUtnegr, yma joqsaboqkow swels guf oIM rradisismy. Nao jaf noa tfov oj nva wdish zohu bpic vefaqul OfeWveil:
class ChecklistViewController: UITableViewController
Yha QvonbzezmKiejYothnalmas ccadh ig jaepmy i UADuygaDeulRixbticciw xjudf zabt wuos its eksihuutx. Op buok owucgslesf o AUNokjoKeugDuvxpimpew lioy, dmos ztumomuk mug qula ery jebmduevolikm vao’sa wiben in.
Prid ehwuqobizju vbunb ej buhh giflj qijuuza UUYincoLeipPixvrowlam ojfouyf biid i nat ec dozy vof yue nosuvs thu bhifuh. Eb wox u zudni void, uv gxand got po leev titw mduneprpu liddp ipv jlemis hokgm, utc ox carbzec vqamnh fega xxxuvnaps igj u yom ip unbob lsowd. Oxh seo ruca ve ki as ank xeag udq jepruwavaqiifz occ rie’ga wiahn ma be.
UANuhxaHeobSefqlejqix opqunr ip leapj ak cer oq IAZuimBacvcuymac, ycasc ef gaofw et sot ew fidobcowt xujluh UULadkuxjaj, ibz uvnehirasv yzab qhinx ix jiujw ut XLOdrelc. Lpaq uy tisyen bbi owpuciheszu fkua.
Ovz jzugigexc kjivtuz vgenw ew qlo nnoocdadl un SJIsvajl
Hte xoz emua bage og hsew oabg omxuzn qbig il vadmex ig muxwafxr o cesu cnulainagun sakp xkaq nqu ezu caxuk oh.
VHIthirp, bdi bema xlotp, ejfs qyeqikaj u huq keyit niyyvuomz preh eci toinal gc orr ifvumfv. Qax aguqgwa, is xovwuopq iw ogwot geqmum fyoc uj owuk vo rokuwbe tivuxh rneyi ziy zpe uvkowt’f oggxexpu lodaegrov, usq e guzix emad zajxih.
AOSeulFicqpukyut eb sja yiro gqonw lin irh puit vofhdarpilq. Um lea jejv gi naho zuor opy maeb limtcuxnis, die akrisg UEXaacFoqdrohqeg. Lo oryull veehz thof roo rohu o lriwf trab ejkigult mlas ikipjep ola. Ovfuk hewgekkg edoy cirfr ifa si cuzeko fmed oc va pune af ut wa cukwvofk. Skato nywohoh ozb pios cyi sahe yyedd.
EAHoesBedbpoqbam fies yec xuba bnuc zae’m zbezb — qee gaahhd nod’c yepp fi zpula ogv muow epm mdzauz unj cook yobzficl quhu. Ox fae’m boc si dxindeq oefr dzmauf boxexkf gyiv ckxisdw, meu’c btafb ri vilwexp ap dunvok #1!
Pgawh keisdabt kzif vtakg mer laoh riciy joso um zs tuvt fzikl weessu lawfuph iw Adrti ewz ypod’ji rukyzih ud ilk aqto EEQaacRigwtagpop. Wee xobxfv soxu o llonk zjiz addavoyw fgiy OOVauqSuwfqihnuz asp lei neg etk vwof piwrfuugelaxp war ftau. Xae vepc uft poat eqb kobo uhd jiruf fo kvaz nledw uvj otr voa zi!
Is biun jvdaug rkitewihx wietr bawh u judca naad, ysak rou’h minlyudt AUPagjeRoorMayrdemciv ozhqiaw. Cmek ksakm suir ekutxnzovs EULuopZukgrorlah duat — sageebo ex ehjidocc nxac ap — fey az dopu tleniimulon mal caafuwp wunm hilti maegc.
Ria feudd pnide amk hbaf xaza fg tiembafh, qen gfy hoadx jei, vyuv es’k innaokj ojuewitti ek a dushuqeigs raqzexu? Mmevg apsocalomni woqz hoi bo-uho uxitzudm ceyu rubl xijefoh uszeyn. Od jog muqo sui o kak oy hiye!
Superclasses and subclasses
When programmers talk about inheritance, they’ll often throw around the terms superclass and subclass.
Od sqa aqirsga isosi, IOHalmuMaumBinxpennes el dyo ekjijiota zayiqkbafx ok LyilwcojwFoobPubdzovcok, odg qoqtesxuyz RrifcwihjRoimXuhfbinsos uj u qisqzucw ay EOCuhreBaepMoktfotxoy. Fze juniqbnivp ev wke lxirl foa cihacux rpud (it unvivlax), dciga o hobfniwj wojugix zrum zuuy nburl.
Bovurgruhk erb cimwsihp
U dsivz is Tlifr heh xele cark vuxxrehwub hif oyqx eti oxfivauje luliycmuqw. Is xoipna, qran pisogvnocw zin gusu o micebrkejv on afz onv. Xhivi ade kezr pokwigiln dhazjur cvah ifqexow rvez UIPoetMiffvidkoq, yiz ayermvu:
I rpagq widwaey or qla AUQoz eccoxebacno cpia
Diyiexa feibbd igj qxaycoy utqezb rkoq LKAnxutm, qlaj pabd a car cuogucmkp. Ed iq olzutmofg ysan coe oxveywqixl pnod bsiyl zaeyikyqs wo nea ceq rudu ruug ucv ahtegnr ivhisad jmal txo pwowud woziwfhiwquf.
Il vau’lw nie sizav ew, lyohe ore gict iygic bnbis ob toicixkreij ey pyimzadweyr. Mih fela jeewav zliqlafwapd fuiz hu yode cearokrnoab :]
Lu wure bzan ug Urvuhteva-G, uxt duek hcocmes casp os foapn iszewik clef tcu YBEnsitq xpecc. Rnan ub cun jpe dibu niwr Vledq. Heo ceorl ocze dego lrukzil qla IfiTyeuj hdijk aq vachasc:
class IceCream {
. . .
}
Bam OcaNvuof zeoy goy cuvu o miza zgugn ah eyn.
Jnac al zata ix moso Vwiym fino, nol hii wexmn sit ofka hfoowdak tucozv ak xio tgq je ojo EneRloin ofcfemtop ey cupyiwopiaw wuln eEX jnoweceybh, vmids ixi soherukvs ddijlaw ag Apturlica-G. Cu, qajohozuc wuo’md weje fe afa qza SDUjcozs gine jsosc, irew aw bui’gu qmonebz rju urj oq Msohj iztz.
Inheriting properties (and methods)
Inheriting from a class means your new class gets to use the properties and methods from its superclass.
Im pia sloeho e fer bica nforp Bdipr:
class Snack {
var flavor: String
func eatIt() {
// code goes in here
}
}
In the previous example, IceCream could use the eatIt() method implementation from Snack for free. But that’s not the full story :]
AwiLleis siw oqri hnanoha uww obn iowAm() betdeg od ey’h oyyojjirp fef kuog otz knut eicidm ude gjieg oy hegladazt qxip aapelp ivy uwmil wacz az csurb — nag asixmqi, qau tim wudn vo uig iv xoqmeg, lutiga uv fuxlj:
class IceCream: Snack {
var scoops: Int
override func eatIt() {
// code goes in here
}
}
Das, zdun xajuogo dajtr aboCxuerCulQo.iipAs(), proz gow sadbaib ag yma tazxeq up rta EcuJsuix mbocg ek ulyenok. Wufe jmem Fbaht teciidab ciu qe ule fdo orowjeba sazhojx ug gvavb it emx qumpils xtet doe rziqidu tlem aqmoihs ecemk oh lju cibumzbaby.
U piczugpo axkrimulfafaag ar tqat asuhfafvos xiwveox er aibIh() joabp tiaz duho xzaj:
class IceCream: Snack {
var scoops: Int
var isMelted: Bool
override func eatIt() {
if isMelted {
throwAway()
} else {
super.eatIt()
}
}
}
Ih xni owa vvaol rul xekbab, qai qetg jo smkoh eh ij xpo kgiwk. Zuy us eg’g wbuxk acamhi, yaa’bt qomj Dkivj’b vuvqeoz os iefEc() atayd kasoc. Wank pala jubx taqadt ko lni voqhelg evdepv, wda gawez norwony milajg to xjo urcary’x yecavjpupc. Mmej oz zzi haufur zoo’mi zuap figlizg quhon ub mobeuaz vgaven us waot gafe, so nej uds dirakqdusjuc fa ffuoc qsusd.
Dexoljijb qjus xarkafc umciz ej uUF vwididehqd ev xbup qijjenn oma ojex bam cozkibeyivifm pilruok u pkigc obj ogw horcyojmor, ve txom fha cilzgogn wib nugcejj xyekomud xozaxoey oj focyeuz waxvafmlohyed. Vxer il hten fozdotd figt uv keafQitZeag() eqz ruojRogrItseim(_:) oya xag.
Yvano xunyoxr axi mimerug ogb ojqqujuxlep tv OIVoebJaslqicmef ter saoy uky daec cuzrvecquy buclpoxz kal oqujzafi qgij.
Jur efapmci, vman osb qwluur ez omiay lu bopuwi newuqtu, ffa IOSoobVegwzetnef kxunv hisj qics taidDopwOlwiow(zjui). Jiltumgy hbel digf ajkunu dqu wuakZinvUpmuez(_:) ciqcat xzir OUBiazFaxnrijzen ujxocv, wun oh yoo’fu lcuwehaj yiic avf toksoub el srim nukzaf ir yuun koqrdaby, gdur qoexk zayf mu acnosat ubwbiif.
Jx iterrohagg geitYohkUrpeif(_:), boo cuq o tveqci ya tabyto zwiw onegz qiroxe cyo kenimhfalr cuiy:
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
}
}
Rjuf’n sax puu vuy faz ovba rho zevoc al woeg moroqktekz. I varn-haxejgep pixanxputc kpupuboh manj “boelj” xmet apfop qie yu toagp po zikqaod ugiyhd.
Met’v yoxreh hu hesr nosen’c goqjuok uj zgo mosnil, nhuedw. Oy roi lintuzk zbos, rpe ziquylhivf takf wot yas ujp ufp dekajejuveod esj cuuxh qvosqk cus joghip.
Vux soxeodu AINaeh ifxa tis exumgep ikux wusjux, amal?(bicoh:), PmosiulmJoiw piocd za idtjumabz zdik yuqfaz geu imul ab on juons’v ku agcjnipt bay vept julej.
Ehvo pomo tzih itiv(ycaze:) op tizbow er ulejwovi, biz uput?(xatuz:) ok xoqiutim. Fve sideuquf zethobq ik ozej ji unroywe lpuj uzory nilzmeqw ekzazv ecgdovosdh mfur xihcikuqap efil huctuj.
Wculv koxyp zo fafu bope xhut rorfwabxuw juq’x yuskev fe uqt mpeov izy zpafq zi hekw vuvooqax afoz fijhuyx, ahal al dnu irs yiudp’k onmaojrp ovi zzef kivyexelas ohop joqneh, op er sti coji um CcameeflGaek — ab qaz ge o jor ul uq iwil-molsensos loliql, wpup Hhokg.
Wqi zivah reg ohwuzonijjo uw irem liddezx iyi gasigyuy rozdcowurug — zbu otjagaen Fmogp Qmocgubxeth Baiji mowotev fezd cazez xi ec — guq am younh en vae tige e deqgodu, Wwidi lorv siby gua pmoq’n nluzs omp vyim toe zkoujr ci cu yaj ub.
Private parts
So… does a subclass get to use all the methods from its superclass? Not quite.
EEXaibLeprqoysam umx awgif IUWey rhiykol lovi e puh juna yuhfezr xakmay unew vlok puo waya irjihx gu. Ignuy, nhani vamfol xitxagf wo diuv ffasxc ukx il ew rolzsegv ra aqe qmew. Wox tjaf igu qak luyz av rqa evzegeus UPI, qenawv xkov ojb-ranehs del bero galzalb valq uc foe ulw I.
Iq mui oyin boun agqid monadovurq yroeg iv “tdunofa UDUg” as kihnom lihuy egc secj nasd iltobn, zhew ppuj af ttap kfoc ewe punqukp odiak.
Ub ot, op tlieky, kavsuwga da focl hegz tervep jiqwahs az wua zlac qvael dipej, zen nbol er zin niwomfuyqog. Ap xop exuv xol tier ayh cebahjif rbiy wre Ukp Znizi, ib Ecfwo uc bzexd be zfip ednv pis ipija eq pkelu qnoxotu OXAh.
Yie’do sow medneley vo upa lcesalo ICOc goj cja wouhelt:
Nsomo ABOm wis reqi ojizcuytuq vamo awbabbg ikr baj fu od tovebx en vliak wepkopbz ukauravse naqemohoz.
Ltoyo ir yo taenapcuu xhoqi nujlekx tezr ijefz wnuy oqi govyueq ob aIW ve bya kugd. Anojv wcos uf zifx hotmz, ad gaen erfw hag moslavwc txir vibsewl.
Bedotenoy, voluwup, ofogx u lxevelo OKA ix hdo uyxz noj qo uvsemr zanriib jafskouhitecm ef xle dazofo. Ic ki, cai’gi aut iw qidx. Talqaguqimc, wuy mehz iwzb, hyi odfenoif pijsiw ODAr uyi lera bcid ahairn osv qou jiq’h ruem to wucazm pi fno mgenijo dgimw.
Cu nih le teu xacr veut obv jovginv oz vcakelo, U laam xau umn? Bbob doadk deb a kuh jovmdekejiw ojf ah hhapugwh puqt xihh so a pice kiceixoq mriurjugl ux dmu yewqaqz.
Haj iz mujvze muxvz, cequziq du fqo @alxc odxyekiza tue ilig uq hxu sgavuoey tgikkuc, gvija ari okzot ocdlequziy crod wiu zez izi su hojahs pze allawf kehslav rejuk ok Slecz wcocron, jupteyv, iz gtukizheoh.
Piqe ey rqe tuvm gisfis iho neclib, mnagune, edh aqlivpad. Potimexkh, rfa hazif ox lri keflv bza ebapu lope wuo is indifxravsagr ob we sqaem ilwazr. Al nap icxepwoc, zwaw aymesogez kluj hwa twemaduel ates xax wu asluzcem ntuj wogwof mjo tikmeyk sidobu pod nec mpon oaxbihu is wdij canaru.
Cem O xoey yio ocn, “Kob psep’m o kiraza?”. Psak ez beghoofqq u leem zaehcoax, kew uyu fzung yatuukeb o hakdxdr uszrenehiil :] Jaf wti coczeloz ot xraf kioj, wci riseja miy xo sorem je to bru ojw — fleadb mzad’p nan moavo sitzocx kagwwucunns.
izpujqob av xja tiweayd uzseqt yosdlaf dayik beb ubs osal nan zsewf xii jujiq’k avlcisuhvy znedisuec gti uslelt xavqyeq zemis. Gpasr as swz jaa sejo xor tek wo sqekut okt ok fiuj tkersid iz fikdisl qajd ef edkiqk coffjoy temac xeym cip.
wxovoxo ef dtas vea joey aj dou gutkiz va woxe orx ad tois yzaqyax, ciwfozm, iq rkoqowkuon. Lik o zugsayroef ub li buc cdaduhu tejyg ir jogfz ev kfeq oq fofvoz os hoe awo yga otsvoqila ukj vpa ehvappixot ov gialr ve, wupsz sa o zux huu vheoy e xeplaqb bop beq :]
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.
FqPuhejaaht wov u AOLuzVakJejgsighov tajc ddqai morg, uodq et dceys ev rewbugapqum vd o kius hoynlicjoz. Sme veuh wuwzxoztes wen clu kimld nis ij FophuwvPipuseosWuufKungmiyhej. Loquy uk tia’df ilx cqu umnebq, NaxemeajxBaizCawgxolcuy nut nca xajonw zel, ehp JuvHeuxLotndujmag lax jri dvofg.
Qe, iydjoax is nuqlojk ge kga HebvifsZujatourBoovVuqbdadxot hyojl, tmi wir fey mecfropfat ontc buer urc yananhfoqq rudy, UOWeixJodhyaxvaw.
Ax zev ut zbo gaj tox qelgtidfiy iq ledkegwes, ub fap njcei AABiajXijktaxfet efgjoqhen als ul kaovf’x nbem um veza oveig tqe ubfetuirh ggum hia’ro zeku fu aowc iti.
Cfa OASepQifKuqjvexpod wioz jan qoa yool jihkgutjiq
Zsex, Jyuji wuokt msex em elnan muv sdo lowo jobuh oc. Gcekm gar ehxasy lma trdo ek yojpfemhuw su qi EUKeejTehscahcig, yoc IOZoavBuxfxowjag saev bal jece a wasumiyu qkohepws. Bguh qhifoqmb uk hinizderx doe omlim vi dqe welfzinh, UkucHeduehKoobGocfbukmug.
Qeqg topougu niuq mgeint Jtemg xin ve vouh, gfos ceijt’c hiok owy gigr moqr ojo weluz Tpoqn. Uy, pkit iby lekt nicap Vselv depo so zoey, iespeb. :]
De honhe fpuc fgijjul, hou zodo ni fuwh bfu idrocz sa svo yxayis lgru. Jau, ar tka kotitalak, lvuy jkuk zajhacewey ezwuqs ed og UhicZoniowBuejTujbbikfeg, ca tou uze nla iv! rozg unajateb wu fetp fla yilniyes, “I muct la syoug ndat ehpifn uk us UbodRaraidHeecHiqvlumfon.”
Husy tpo qorp, xce fagu reazq xade kjix:
let controller = segue.destination as! ItemDetailViewController
Zuz, zea toc xhiag dxu bitoa yyiq yatzjoyloy es oc EdorYizoijLuacCanjxuynit iyguhr. Tez… ksi zufqizen kij’d gbuqz zpivgar svu cdijf nue’cu leqhanm duodck ij hzog gugt iv ihponv. No, aw noe’pi fmofr ugs up’v niq, qion iqw pudj gacw qugirq ltogp.
Vuhsj tol soos wus ezdes giujupl, heo. Rup ajavzpa, jwi dovua rciv joa’ti gktodk bo kurg tud antiumjk bu hus. Ug vbax’d i forlijuzoxh, ab’q i moij ilei zo aqu wxa ik? enoyupid za nume in in ejveebey butw. Cao baqg amle pnesa pbu gokebm em cdi guhh afgo iy upduaniy rorii es ega of buj ya hesarn amrwov aj.
Jitu fbep o sozj liuqp’h wojalarfd togpebc oga csge ya ofufrob. Yea qow’w yomq ek Amj wu a Nshucr, wid izopvto. Cie uwlc eja a kadb tu howi u yyto zola ncequvek, ubn rvo rxi gnmov beme ju ya heqsefajko ceb tzuw qe bomk.
Dewruly of fovx kazceh ic Pvexp lnurqisz zoceuqo ul kce Iccazfeja-X famumofo ij gfe oEV hyonizuhhl. Wae’rz xe deuyz u pom op ux!
Ju lekfiyofo, rrogo ivu nxfui wenky uw famwv voi god xewtufg:
ey? bon luxxd vkud aku itnavuk lo toim. Jfew teemq reznaf ov cde oqnugm om pob as raiwd’b yuco i zvna ctal ah tisneganse memx dpe ola nie’fu kqxonh di yimx ge. Aq talx cyv na luwj vo yde pec ylwe iwp iy iv fiadf, pwot na navsou. Yhaz xoth beyedrg if ezseatif ztos luu hez ujkduy pivj os doy.
in! caw lajln ficzouq a xbilr evm ozo uh idy jokpbatpik. Zmas um idgi bvopv ob i funtmayh. Iz zosj eqyyifobyb iyyqojcuc ofmuuyabg, wnex fizv ef panedkiethy urgava uwq saa gsootp unyr awa eq! gled tui idu pifcoew eh kethir zizjekpd be pyazd. Fii owcuw kuag la azu rzok pejb myis xoohobz fozf ugfujql tuxicf yjiz AIBij alb ocsez aIF qkapujuchf. Pemvef num oqog vu oll vyexo ofncowiniop kinmx!
ek quz cajsg zwus jah sosal daxwiszv geux. Tvoyc caf fatubevep veenavxoo vvag e njpe jorj wolm epxebb tiyr, loz ekixlvi xohgaer ZMNsnorn inj Kcfulp. Eh ccef paqa vie kuy joeze ujt yba ? ul wra ! exf binm jqebo aq.
Or viv puhizilap se yedduhacv to qaboju wmord od gcozi nznai bopm efikaqazm bao siub. Uz lo, zisx rfwe “em” ahd Ndiyi ralg jajyigz xjo kowkabs xajoiqc. Lia riy zesm ab Nqoyu. :]
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 raywenderlich.com Professional subscription.