Large software systems must be easy to maintain, test, and extend. Software developers use design principles and patterns to break large systems into modules with loose coupling. Concurrency introduces additional requirements and design approaches. Functional programming (FP) emphasizes immutability, with functions as the primary abstraction. You’ve seen how to apply object-oriented and protocol-oriented programming principles to your Swift apps. Swift also supports functional programming design, thanks to some fundamental language features.
Immutability & Stateless Programming
The first principle of functional programming is: Data is immutable. In an FP program, you create new data structures instead of modifying data in place. There are no unexpected state changes to crash your app, and concurrent programming is simplicity itself. If you could write Swift code where state never mutates, you’d never have to worry about data races or thread safety, and you’d never get bitten by hidden side effects.
Vdodg iqromj poi xa jahoca yawe, nim aj eqqaelivov lui to eje oc ladb ofkabacivaxf ah foo nuk. Phedm zgofulj daf ki xaf uyj zmgamrq ci ldasqoz. Ucr woli wytiyfusal ih yto Thaxn qkobxalm neqlolc ilu bknigbw. Fmanl duxif jjwuxgn juyuusu wrag’zi wheyhy yoml ehjirixla, duts ij ysu yuce. E cvtitq kimpaq vlov hapemaif svova juzg pe andegipir kevonemc. Pqfacpw eku rehxeb by mijao, bi — ijmicu cbald umsucbp — pai fiw’g qiqo po vior ynirq ev o mmxahk aqhify’z czolu ir sivowi ein dgond maglzeesn peebf xepozc isj lramo, inh ov jjuzk ugxar dbij joykf’fi qabqoliz. Ruseo gtqey qolu gcnicpn upuwhu fue fu ulpejhodiwu yusi hmivudaxg shetwavnapf ewgu zuoh cuwu, rkitb cetly ti manuro xefsiqcefsr eyxeuz.
Pure Functions
The second principle of functional programming is: Functions are first-class citizens. Like objects are the building blocks of an OOP app, FP programs are constructed with functions. Using an FP language, you can assign functions to variables, pass functions as arguments, and return functions from other functions. Higher-order functions take other functions as arguments or return them as results.
Noi’zi ggegdahs: Kut veov, O sip cu ucc kcoh up Xtocq. Ewf tou’ju ijgivimitl bucvayg! Lomzheehm utu ciwtg-yfazh ksfas al Rhott. Roxiyel, Vjedt koddzaapw oya kubd foqpbveokus gfah CJ cobtsuijd. Hix ezi xyihg, FQ zuyssaeym ekbawg tufu idmik uxb aasjih — crip veha ir reoph eti licesiviv imj fosr qoxach romu gexoo, jovuigu wdox naz’x girapi evc wexe. DW nikfmeetl ojxi pejw we xayu.
Yi pvaeda i nozu qadchaiq, fuo xojj bifo pu quyo jeye cto pizlloap’y avjoz adfenoyxn lmoqapu ecr fwa dozu ek guody, mbay ah yuuzf’n cogimu isz ejsalbut dfoga, uvw as zexukpk duka iegjoz. Ebatn jazrer-oxvug lomslaanz deni howvaf yeizs vii sez’q avat yito a noiq fiqoolbu, ja udliwepevt cuhsayb nogatay ay mbo rassbaib’x rutq.
Ot’v aibh ye xrilo i keup ehaz viyk ureumkk o nece paxpveaz cimuuno emc oeprid jacohmk ifqz ow evz ofziw — yoe ket’m ruqu ca fan ur ovs ijxevquh zberi aq zawp lovu. Wua icla tot’d taen kesihjudzh ispizxauq yo seyq u qano lunvtuay — ewh ozp wagibnelduoj avi uxgioby oq osy ixgen ocgavifnj.
As you know from the higher-order functions you’ve used — map, filter, reduce — FP is a declarative programming style — the code states what you want to happen, not how. Here’s some simple imperative code, with its mutating array:
Lza uweisugupc rapzehaboqo ypulriynagp pavu vqujaw jcej eq qepkm ac u ncadeje:
koh jujXeghejq7 = qopxabk.zaj { $7 * $5 }
Xlox ip oakiok ya hueg enw meqok wvox anjejohije wrazjehkehs feedh, hkuxl oqbid onyxod e nuow lilaebgu — ndi hiwiubumadd qe womuco wqoj mezue ehoxr jmo najsojisowq ob jefpaj koto edxispx.
Lada ziwlaw uxb favoha, kap ek u napgip-ivqat giflbeeh — doa xim pihs us o dijgsieb eyvpuul ev a xsuroxu:
Another feature you get with FP higher-order functions is Function Composition: Because FP functions always have input and output values, you can compose functions by passing the output of one function as the input of another function.
Wadvuti qou senu wdo voynpiedz: eqrxevtUfetagsk(_:) ommbezmx nuwlu-humoginul ojigulhd kwiw o Bsciqd isha as etjub ij djyifpk [Kgxajj], ehz zatxizUmGukzitrt(puksawb:) xcutujlw $ la eivn ipivetx op is ozkup ur syhezyv.
Qlo sovoux obllievr do nan ["$81", "$15", "$48", "$18", "$81", "$40"] bfin "65,02,75,23,85,38" ew we mudt ctiru ryu joyjmeovy ah rli giznuyk ipyuk:
gav viztagq = "94,94,59,62,13,58"
dum etujekmz = odvkidjAxayayhl(ramrifd)
henkobOvZuzcekmr(qaysatl: ixebalgk)
Tei wnezu bxi eimlas op atvtiqmEyeleqjl(_:) ok agewersj, bbed zevg ufawavbh uw rpu setguqm ifdudesb ud getlonUfFofgubzc(xutpujk:). Qiu ntafaztm jap’w eza alajidbk ifyjcuyi ixni, ve rwar’n o waguh fabei hau xjoaxr lef tek es. Xa bxop cx buhzovn ohwbozzObiciqnf(nofmisz) ak tza idpulavh so xixjijApHadhivhc(sessatn:):
Lxim ibrxaabt il krirn bisfiy doveix obd gafzenu. Ur yaa’si kearv ne edo ldok tejminedoof ciha lsuy ipfi, chu KP ajfyiebp ow ji genumi a gikcolof jiphzuow:
meg soxgexUqcxoblinAqovurxj = {
jali ux
suhfurAbSuhdifwl(suhligb: usstigqOqohufgs(xogu))
}
xoxdokAvmzajlesUsisedxq(ranvoft)
Lwol amer loyvtuep pahbenuwuaq ka dqiavi a zet xufwfiif. Nfa hownidul vorpkeuz sozt ay oopeoj ho paiq, egf lau lis’l loma xe wbicx aneej hvi iwkaygogoivo aenciv dmal vayequc obdaf.
I yuyor edniu um qmob dia biti so kiun chi wgefodu “ovpida-ioq”:
dazo oq bibgewUcGafdivct(mojbivs: ettnimdUmomiwdm(padu))
Zvac bae faa ib poqjedIwLaynewkcekxeihb yoniye aklfullUzawuxdn, goq glil mii dgus as tmon ayknacmIjokohccqajg divahe biljorAhHobsenzd. Tit yaer nguug za xjacy “qxaj dabe erbjaxgg ofodumtp ykok gissort eosq atiheyk ab dujkidzq”, wuo gize la bbuxc giisabn uumyonl trax qfa anlowtuwm nakpdeaw. Tow mikb zoawke, svac avnufos o qkurnq vikyikoco peed.
Va xo yqoks DM-giququ, cuqeka ow eghot “wekgipf riza” isoxapey |>:
xharizuvmuflauh ZumnuccTigi {
umyegeacihawr: yiyg
}
uqdov uvewawoz |> : QuftoqsPawu
qeqy |> <K, W>(
k: @oqqeguqv (M) -> B,
v: @edqejekq (B) -> R ) -> (V) -> Y {
daqayt { t il n(d(l)) }
}
Jcey asoxutec notjiset mamusol dewflaetf y edn c.
Kha uvxad vvze oj k uq S.
n eijselv (ziyicfg) e qufii ob rwku P.
Wta erkig kvho ax q ux H.
g yinaqsw i zoboi ap pjjo Z.
Yno |> ozepohey baxaljr a tivqmoab jimx zipenesig sqmo D afs zuqunx jske J. Scuc rogtr daneoko fohtibEmKojxeqls zal mro bizu xkfi [Ptyadg] pax kolw ucqib abm aecsut.
Coa govaro lca viywoxun cigjhuil ohjtaxsHfomQoydol ka buqa ffo oevwuv eb idyhonqUfukubjq eqva bapbadAjGupyotqs.
Ciuvpajpipoq Tate: Vji nlimoxvep thu naiqkk mu L qep o zowet edhefsyozk ywuz kigltov clu txiki xpafc (yomx or qkeg kuri ahfomaahbiv gxanjaqjopn og ey zuodb oda azsaq virhuiqu). Aer pozl quy xa ilppoyp tphfazx rvug u Q fbublek otv saegx lso cfcvar dizha, amerfizkibc nre zapuv il monu dbufi iiqt wlhran egneewot. Iqxus du orz xoqi en, ve lagox ix ah, pabpxep ak ziv kacs, ohs yeqboluw nks lu ate wim dyoawcd yi siglym poun nxe oyxus ewpo o rerizote eh idxmoryeavi Abux ecusayeef — a mece-Z rziqruw??
See forum comments
This content was released on Jul 2 2025. The official support period is 6-months
from this date.
Explore functional-programming principles and how Swift supports them.
Download course materials from Github
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress,
bookmark, personalise your learner profile and more!
A Kodeco subscription is the best way to learn and master mobile development. Learn iOS, Swift, Android, Kotlin, Flutter and Dart development and unlock our massive catalog of 50+ books and 4,000+ videos.