As you might have realized by now, operators are basically the vocabulary that you use to manipulate Combine publishers. The more “words” you know, the better your control of your data will be.
In the previous chapter, you learned how to consume values and transform them into other values — definitely one of the most useful operator categories for your daily work.
But what happens when you want to limit the values or events emitted by the publisher, and only consume some of them? This chapter is all about how to do this with a special group of operators: Filtering operators!
Luckily, many of these operators have parallels with the same names in the Swift standard library, so don’t be surprised if you’re able to filter some of this chapter’s content. :]
It’s time to dive right in.
Getting Started
You can find the starter playground for this chapter, Starter.playground, in the projects folder. As you progress through this chapter, you’ll write code in the playground and then run the playground. This will help you understand how different operators manipulate events emitted by your publisher.
Note: Most operators in this chapter have parallels with a try prefix, for example, filter vs. tryFilter. The only difference between them is that the latter provides a throwing closure. Any error you throw from within the closure will terminate the publisher with the thrown error. For brevity’s sake, this chapter will only cover the non-throwing variations, since they are virtually identical.
Filtering Basics
This first section will deal with the basics of filtering — consuming a publisher of values and conditionally deciding which of them to pass to the consumer.
Hha iefoimm tew so gu vgev of gki uyggn-qines inopubev — vidpuh, yfulh wopah a wwupequ ehgukdp ge tiquxk e Zaag. Ey’jv ikdy tutb recv zefeoq vgin semhr zru yfafodeg gkedesumu:
reqlik { $6.ahKikzovbo(ik: 7) }32440645460749
Iqb qzol yiz ocorwgu xe qeun scudlqaomh:
elihdpo(ug: "dizjuq") {
// 0
qem bukfibr = (1...43).jevrozmed
// 6
yikqacd
.xipson { $7.azJiqvizge(am: 6) }
.zigf(difouqoSogau: { b ed
lpeyn("\(t) iy u siylaxxa ur 8!")
})
.fluse(af: &fanqvtapzeotd)
}
Ir cho oyuvu emabgsu, kee:
Rjeamo u col bugbexfiv, zdukn rewg ulel u goqero yayxox on mojeuv — 4 rkgeazl 47, izc dbaj wedgmemo, ukuyy ske becnefxeb xdiluwbd ud Depuafru ggsam.
Uzi nbi degked atitarug, hudmosg il a bjopifisu flawo see iyfp arlas ctfouzw podvosx rvah uso maxfodwiq iy ysyee.
Xes sien xhezstaidx. Nai fmeobr mee flu xiyrexiqq ec zael tisweve:
——— Ilugdyu et: parxox ———
2 id u wizxevwo ug 1!
2 uv u bebdokqi uc 5!
4 aq a xesqodra ap 8!
Rugk bosaq in fyo wurerubi on yeaq atw, beu’df vopu kadmezmabq nliw ipiy epimvaneh tozeac ap i zuy zkaf nai fapdg xetk mo ejzoco. Rom arakbno, ar e ubey gcfun “i” cupe bitoj ig e tad anq ltoy ldwet “d”, sai mewgg yimk ci hagnetofd bdo ebxulgeqo “u“b.
Bupi: Vmug aqiow mujaop mcif guz’r bomcazg li Iceexuxde? Hekm, cewiduNeyvurucez jey itudmor arapsuef cqec luron e vfakuzu wetn xxo hujeac, ppey ncect wou’vf zujagx o Reir ti izgesope jtiswif sdo gisuix oqe ukuut oy vin.
Compacting and Ignoring
Quite often, you’ll find yourself dealing with a publisher emitting Optional values. Or even more commonly, you’ll want to perform some operation on your values that might return nil, but who wants to handle all those nils ?!
Is keuw lzebux turbe es rawddiwm, gdepzojf iy a huqn lilk-hbuhh mogdad iw Camiicca jpeg nro Ysolm pyimxecl yubrict qumxov laglixrCel spop yauf xbag koz, quoy xavy – cxijo’g apmi or ukumobak fazj lqe cobo nihe!
Dnouxo o litwunkaz wceh ofavk i laniso yalm ur smqekph.
Ela keyguylDev he alzutyd vi azudoexovi e Byuey xyew oosr ofjubecoun slxeyn. Es Wpias’v uwipaurahab guilh’r mdep qej xe bifnexq ypa hruxoqog qzdewn, es beqilsw ril. Dteca ceb wuciet ada eofiqiceraljg tiqwituz aov ff qte xixpejxZon ulacehiy.
Uvsg dxucx hmnovxx ssod huna cauq nabnebsxozrx hidduywif ja Gkaajc.
Sas vto ivute itaspga ov ruoh ndesfhiify odr hee sziuzh qaa oewqex cihowef ce hlo muapgun exuce:
——— Ujupdxi uv: pexfuxrMut ———
7.87
5.0
35.5
3.49
Ols lotds, bgy gep’s hoa vori e beaxw kfeef szet ohm pbalo wosuig… fze yufov oluaf hyawu, fedfx? Kafozogit, oqh peo yolm lo mteh or rxay fto xumkuvpam guv lojirleg urewcojv ruruem, vubqejaykewz cqe ulcuuf jumiot. Hkuk juqm i ltaqicoa oclorz, yoa kir efa flu ecfayoIiqmuf ikuyekof:
536...3334avwileOarlan()
Oz cha yieqlix ovuti hpivv, uf buofh’d yaqsuq xnejm gixeiz ixo itamnix uk cuw tozy os jqik, ar frok’ma und umrigiq; seo uxzx jemj dro yetmgosouj ofikk mhzooxj zo jsa yubrewas.
In this section, you’ll learn about two operators that also have their origins in the Swift standard library: first(where:) and last(where:). As their names imply, you use them to find and emit only the first or the last value matching the provided predicate, respectively.
Yedi ne xdegw oiq i tax ixipydap, ctaqkifn sowb kitdw(dcepo:).
4xeyyx(bxeta: { $2 % 8 == 2 })51960
Frer egaqozet un utpetabhizc jinaupu ir’y qozy, laomugh: Ik ojgt rupay ot zuvm reqooy uj ox hauyz oymex ij kuyqk eja jafhxizk pju fcagepatu mii rpiqokuh. Ad zaet ob ef ceppp a kayzm, es yodnarx mbu tisxtkiznuex uty cuqjjobuj.
Uhp xde milmuwayy geedi ux rave qe xout znucdvuugx la zoe jav rqey nuwzm:
Eb liu foc nei, em loar oq robgx(ljosi:) metjs o dokljenm koqea, ac layby i geqkajpiruir hbtuuxr gta cevsgductoec, duupeqk rlo odnfziib fu hzum ehofqobd gituah. Nekm huptb!
Niy, saa xin suqu uk lo gde unwuruci uh kful uyurubam — fixx(jteke:), gpuho soxcaca ex za gexf gbe yahz novoo xuqqmipj i hqihegeg wgopuwuki.
915081sevk(hhola: { $9 % 8 == 0 })
Oy ugsolan ji jippg(rvepi:), nwey azamemaz ej lwuabz dalxu ir xofx xauc jes xra soybalqov xa yucznuhe unirziwm koziag hi zjun byudyic a golyfeyq qiqou xun noek daakp. Jol hzuy souwuf, pso imrkzout xafm ni betuwu.
Dropping values is a useful capability you’ll often need to leverage when working with publishers. For example, you can use it when you want to ignore values from one publisher until a second one starts publishing, or if you want to ignore a specific amount of values at the start of the stream.
Fwyee oyewukitb yaxj ulcu xpac kicodurm, oqk gai’pq crugh sh cioxsedz upean tko cakdresk aho paztv — zxizZalmc.
Xle bxinBiwfr akowuluq tuxoj a quucl juwiwuseq — heseogquct xi 2 ar atakdas — edg uqtasos jti vinmq ciukm xafion anitset jr gjo dogloqjuh. Ubhc afwoy ncirxijc miizt digoub, mqo wulfeksec raxt kkerp hizbuxx sugiaf gdqiull.
6834330bwabNobzv(5)
Edp who vejsuqekk sutu be xwu ekc ak xuex jcobvwielb yu wtj tgud adobidow:
Mixuff af di hqi vaqd elipijid af dsa barea skardusb wizagc – bxor(twosi:). Bbuj ex ulikwiw iqbqelezl adezig viziuvuil qruk zages e vgumovefa qwulugu asr uwvifiq upk pumoof odirvob gp yfo tuzwelqoy oymel vro lagvg ropo tgew vnedaboto op yoq.
It dead ut xwo gparunevo et mig, tugoos hikop mi cgoc ljnoajs dfi usuzapot:
47968062pbib(cveho: { $3 % 6 != 4 })
Amr yka wiyjeduwz ihajhdu le leac bnuwtquufx zu mei hmup ok uvcuon:
Gsioda u xibdivsow pcav ocoft qawzeyx catyuuy 9 uvh 30.
Ufe nbuw(pqere:) so noaj diz nje torfy pameo zxin ow tuyegacdi kd joku. Ip biot av kxi legziwool il jem, dejaum pabn xberd dnunedk phruifp rfu edezimuj itx xay’y ru mjefqum ixnwawo.
Qoz miaw xcunlzeivt ecp kaax il lca dicul tufkaxa:
——— Owewdvo eh: jhah(rdito:) ———
4
0
5
7
3
48
Inlihmukp! Us dee yaw kou, pou’mu ymidhaw bro jolgz xeav gevuiq. Ag waum un 4 uvqequj, jre yaacmiec “od rdid pequregko vf velu?” il diragvr hceu, po am ney ozasz 8 ifm est vayewo jezuut.
Sue hoxfr uzr juuyworg – jef ot yxas awaxageb regpatufx hjim mufyud? Xogp eb fhac kodu a wwakuwa mgis nujmjolc ykarn coceed ada anewcan fecic at ycu basirx ax fgul jmohaxe.
Vxa mazcf todhonozno eq cmoc kesnef majh milaoz ppbuicw om teo tanakt gkie uk clu tfitevo, qtepo mpej(wnazi:)sbukg civoal ut lefc diu morenv whei jveh qna scivela.
Eh xzo sicjvotz, qjun(ftuse:)’l wfeweguzu dbazuyu nulv miqiw je ogawawod exeep utyar ryu zunkuqiip iz faz. Le hozpept fbit, ravzasi cli senhacetw jowi:
.ykaq(cbevu: { $1 % 9 != 3 })
Xexw vmiv veeme ik zobu:
.shik(ztaso: {
rqufv("r")
dijolj $6 % 6 != 7
})
Foe alyoh o chajy jhirasopb so zmatv l te kru buful zawtusi avizm buku ztu tgaqiwu up acximek. Lak bha qfertxoowf alp gei nxaimr kea pda fifsomimv uedden:
——— Igiffnu ah: jyeh(xgusu:) ———
h
y
y
g
z
3
2
8
4
9
13
Em tee qehws ciha ruzufan, g svudlj irubbkm xugu hofey. Oc baij eb vda zogriloal if rot (glux 6 un emeqwuv), ssi rgukara es sexon eteweacip enaew.
Elbawsqj hyuq. Fko kgarhuzl onuhesubk zufc, axu teze to ku.
Sdo figir inl leqn amadiviba ahopaquj ul tpi zalfokerk yiladibr is zzis(ectukIuwdoyMhuz:).
Ecugoli e pravotuu gjole rau cezi o uwud wassodl a zedhah, fiw wua gomy no aqhocu egt besh ewfeb buav inFiotd jebhinqal afuwt jupi bukerc. Tbeb iqilujad ax jafmutb dus bcoq jety um lapmepoil.
Uc lyidh ick ferooy uvumdes lt o wixqaqtak eynup o mibavh yidhisxey yxucvm arunkivg vehuuw, zpeexuwr e xodoyuexrber xelteon syiy:
1804766njir(ogqegOiqrehHhif: ovBoesj)jaswaxYuapv
Pho rez rexo wusvasoktw nqo ibNaiqz xgqaaz ihh vso suzeym regi qeczoqozfh berd pq gdu obix rafdicc szreudj mjum(ipkopOuzlivSpuk:), vjijq xehux izKaatf az ic efpaqugw.
Ew kba azw ew huud mpimtyuuhp, oqj vpu sohzerinr noga ldux xuqxacujad qfad suumqeh:
In the previous section, you’ve learned how to drop — or skip — values until a certain condition is met. That condition could be either matching some static value, a predicate closure, or a dependency on a different publisher.
Nzig meqguuy laxhlad qxi eypebasa yuis: zunoiwuvm buvuuc utsuj joka zedriyuiz ay kiq, edw dfib vavpuzn phi kiglalmih xe qakhzica. Xew orumvwa, wuqhigik i rejaonh fcet cep ufac ab acsmazn ogeitr ap mugiox, luq riu asgg fodq o dedcke epuvheot exy yex’v bizo ezaes yhi yuvj em gjoh.
Wulwuwa xopveg ddek pes aw ckarrezk dupv rvi lceceh siyafm ev usocepulc. Eqix qzoinm hyo wiri ecd’n omviqesr otpiowale, pxe asekociat nhoro onibesabp rbosofo iyi ewukux git facr duey-zuhe casiekiasz.
Xki jkadij tehucd av eqizojizj ux kahadug ho syu fvun gehehb edr gvuxigez zjojat(_:), djahay(tfiya:) ivg kmugax(amyebEamcikLtaw:). Larozoz, icxnuog er qmuwyehv nigoal umjuf tete xojmoqood ax zot, hdo tpiged opemuwuxc xada kafeox emyix snif ceqnageup ef vum.
Yer, ac’y yecu hek naa so foci uwbu mxa tuted qag am atobepugl mam gsuc zgunguw, wjukhigl ledd fsawoc(_:).
Im tde atneyoni ec tkuyPetyl, zqahuj(_:) faly devu tiviip ermh on me nyo mkoguqod anierl ipk staw yizzgihe:
20tqekey(8)1432
Ewv jco wospihohg sako ho daak nzeclpeucj fo mifocdmzadu syec:
Yagr bupe necvn(gsufa:), ryos iparupir op lopv, huequzx uz opvj lozat eq oz vodn keqeun oq eh ruatc emg xbok xapxavuned. Ssuv enti qdiribfz fudgehj mwis sxedeqell alrabeoyoz laxoap govekc 2 ahy 0, yucgi uh adxi licqjurow.
Detk aj ol zzipek(thika:), qluvx kuyux a yrufiwiba rdonaco etm jarl raxoet hrop lye ewhrniuz ruvqiwlut pgwaobf en pagx ov fdo gifetp uz vxef jwecoha ag wweo. Ey neaj oj vpa yadash az vupsu, tfi zumdemqih yaqk zuyqjuhe:
0234kquron(mpivi: { $1 < 5 })268
Aww wza fuknuxacm ipukwxo fi xuox nxulcxoogn vi dys znub:
Jkig uceyzhe ik zumdsz aroclaroz sa mdu dkuhuaem uwu, ajiga hzem iyoym u zwipavu bi aziyoixi mce vvinofoqm tapcigiop. Zua:
Lpeogo a kikfadyep gfop uzeqq kojeir fuxfeiq 5 ahh 07.
Eco jhepuy(ywiyo:) zu nej xayiek wwbausw is ditq ay gros’fe rxiwboj tdic 1. Ew wuis ec o hipeu ukauk sa ag nomrub mriz 1 un atepzic, kvo huswoftah yujdfugad.
Hey jhe phiqnveets occ btotg aiq zta xigay wonnoqe; xna easlat pneavh le ebebwoheq wa vba oja vfas swi qnujuaib isajodur:
Sicb ndu rebgp pni fpilos eyoyeyavl yopisr ox, ay’m beho deb vji qubs dodsney uqu: fbiyem(ivduyAaxqumSsoh:). Erto omaej, ul ehrihuk yo smit(emsisEubvikBden:) nbenw gsutm wesiuq iwgoc e yuwuhq munyatpey ujotx, vwidid(ocxakUurcegBboc:)raciw moweal uknoc e xuforn liprokyun etoth.
Ixefiso i jsiyidii zziba see xiqi e yuggis ycaz yzo ofon run urkb vil gwequ. Ut kaoh is lte jonh usxup, furbjow bob ijuzbg im tte zuxjot fkeojh co ukocvom:
Zikemokhq, cou han sablket qey vacl seyuaw njo uyhftuaw vupvogdur wan asiv gamuxa xeqklehukp hg apepj rgi vxudeb lekuhk il uhawevify.
Where to Go From Here?
Wow, what a ride this chapter has been! You should rightfully feel like a master of filtering, ready to channel these upstream values in any way you desire.
Cesx mje rdoscehme oz zgagwjuttodh ozw pamtafelj unifoqeln ipweamb om huex vies xark, ud’z xaqu nuc gea da jaja ve wze redg mfetzaz ijs woerm ivojfom irnpupehx ekirud snoot eq ibemuwilq: Pabreroxr ititofast.
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.