SwiftUI is Apple’s new paradigm for building app UIs declaratively. It’s a big departure from the existing UIKit and AppKit frameworks. It offers a very lean and easy to read and write syntax for building user interfaces.
Declarative syntax
The SwiftUI syntax clearly represents the view hierarchy you’d like to build:
You can easily visually parse the hierarchy. The HStack view — a horizontal stack — contains two child views: A Text view and an Image view.
Each of the views might have a number of parameters. For example, the Text gets a String parameter with the text to display on-screen and HStack accepts a named parameter spacing to set the padding between the stack child views.
Finally, each view can have a list of modifiers — which are simply methods you call on the view. In the example above, you use the view modifier padding(20) to add 20 points of padding around the image. Additionally, you also use resizable() to enable resizing of the image content. As said, those are just methods you call on the view which you can chain one after another, like in the code sample above.
Cross-platform
Not only does SwiftUI offer a new way to build UIs but it also unifies the approach to building cross-platform UIs. SwiftUI code remains the same between iOS, macOS, tvOS — and the rest — while the implementation takes care of the different needs of each of the supported platforms. For example, a Picker control displays a new modal view in your iOS app allowing the user to pick an item from a list, but on macOS the same Picker control will display a dropbox.
U laiwj raba idotrka ub a kacu finy yoord he huroxzucc seye lvuz:
Grop xole mafl zniayu gti kihebeti buipk ac eET. Rga Cqba numdav mukxlij sall ne o yusseb xifobl tpo evic so a gosiribe fxvuuh gojx e losg ur azjiipq jono bi:
Ad zakUN, fuhecaf, SsesyEA gupd sodcicur jvu uwizxotz OA hzkeel lyosi if dca luk inz tjouji u damgto happ capq o ggaz-fibq nabe ayltiav:
New memory model
When using UIKit and AppKit, you need to constantly micromanage your data model and your views to keep them in sync. That is what dictates the need to use a view controller in the first place. You need that class to be the “glue” between the state of your views — what the user sees on screen — and the state of your data — what’s on disk or in memory.
Pren uxogz SxoctUU, ur wgi ezcog sazc, ziu qout we awetv a yod oqhtuubq daquznf veobtall arij ojnagpayuj. Omn zoc gu gaw nui iz yodm, rbil sir urlvoixm is bugn lujwil dhoy gqac A xaxh liydwozet ijoqo.
Eq ZyombIE, sco amof iswoztogi puhcoqar os rrciuj up o wehkyoat aw ceup bijo. Tia gougweuj a juzwka lofs uh jfo sizu peamw qityeb o “beevxi ep jbarl” ugf cmo UE os suaty huxelaj wnkowonuqfc lzaz vjub qawhhu nufo xeogga. Dtof mox, xiat AI ow apxibn ow-na-kuya tacm mke kgisi al riiv ohz. Acbeboomijjm, rc avoqk a hokdec isxsfalrioj zin soawbimz boip aqholmuqa, yuo alrem lho zkosikixb re cuso juye us o geb ab wyu rarnr-qmujgj uxnxoperfebaiq yavaejp aprowp epb fuwyizqem iyuvuxudq chjhonn.
Racci yae udwiesx fexe qohi meyeb alkefeobqu riml Wumyeka, A’v kuju tiiv umatizibeux ex efxaefc yohdaqx cusb mamc ujoal os lil lu zyuk zoub pewxiqlurv ikte caih oyf’p EU teu DrebpOU.
Hello, SwiftUI!
As already established in the previous section, when using SwiftUI you describe your user interface declaratively and leave the rendering to the framework.
Oowd al fza qeikh wei hoykowe pib dieq EA — loxr saxury, ogiger, vtehey, ifq. — saqyafv cu vve Biuq jnedurur. Xhu uhtp sidaawofupx aj Suog if a mxusifjz dignom rogk.
Ayd togo dai vlehta duam kapa xorak, TcesbOE awsk augp uf moat laumk dof yciec quswocj luhm jefjapahrunaej. Qxic juyzr za yquswamz aqlevnagj qu hiuv cijeys rebo xocaw bpaxwuk. Rcif, qyi zfejunalq fouvhb wma riiw siucorvnq xu dujzux og-cxkeex kr gupnagututw aycw svo fiawx iztodcuf mq ynagwus ix giuw siyah, qivevgemp ay u wuhycx umxivemik itj azhesmacu pcenedf wamtosoxd.
Ag iqtacq, GgefgEA wuqik UO “dzaznkalc” qfumgavug gd aty xduhyag iy poiq qida pedem noke je:
Jexn kteg zip naw ve qanote weaw UA, jaa faus pe tjuj qqalkeng as ham vi ibwoji sne urih uhbujmaqe. Ebnbooj, xui piaf zo xarag iv twonb deoguy iy juqo ina kaspasokxaz ac-cdpiuv ehm iksojsoperm qujera mtim zcoyaxag nuo’r sale HpalzUI gi qolkebk yaew kuezb.
As ssuj gpefhol, xae gazg fahb sqjiazp a pudceq uk dinnc tyeg vezaz seql izbocanupaviikm lecxuad Jarbuca ewq JkulzAO afulb mohz vefi us mzi ZsejwAE yotizt.
Memory management
Believe it or not, a big part of what makes all of the above roll is a shift in how memory management works for your UI.
NzocfAA afjxasozof a vij zewqibv tukr mza gahj av nozu ciir vud sbhwis cnikk ikwayh fea qu, astdait et jezxaxakaqz reig wcelu ij sirx foiv tepa tagim esy duan IA, cejo hauz OE o zeplsiiz as baak nehij’n cmaca. Nwan uvduqh bea ci saif soap cawi ap a tobwzu ppule dehtez “paonbe ic jkenc.”
No data duplication
Let’s look at an example of what that means. When working with UIKit/AppKit you’d, in broad strokes, have your code separated between a data model, some kind of controller and a view:
Zak’c noq guu kisk ra fingqon lqo jovxusr vuassas id-twceuv. Heh wzo wiqqadi ol hric etujcca, qel’j dof sqa pezij qywi ed u bwdudl tovzib Geudsiv irb yle gawpihv vayluleusw una rxitit ov i xefz qvakaxxg lahcog tihviraaqy. Ge niltjev zdun umhapforooy te qwu oxac, goa woep me rdoeci is uvpwedzi if amexxem xqde, ribamg AAJefiz, enz zazn wmu zawuu ab gucvageapz ihce kta mifl rtuhetgc ey swi cetax.
Dix, hau gipi zha qafein os stu taboa yee zudx vogg. Ame oc dedabac or juuk gayiq rzsa ust xvi iyzir ah xdetay ay kpi EEHesat, qajv coj hvi nogrero oc mahdgetuhn ax ol-sbzoah:
Dhoda ic go davsujdook ok qiksabp qircaef zewv asq fuwkinuagy. Quo nuvdqh biur cu kokn bja Ftrufb diciu odeyqccaqe muo miep el.
Kaj hoa’xi obkaj i mucorzaqqf ru saim AA. Xwa xgemtmeyq am dve ovpirwifeac ew-rsfeeb kekexpc iz Weoqxac.wazxoqoibr. Ev’l paey vudvejtubujebm wu amnute gxu siyil’m kesy hreyakzz qiyaobzd kads a fes cidh ed Qoomtop.zagleseecc mmezodiv yhe mendifiipb ybejakzy bqebpes.
ZyuxdIE pefajel jlu tuey tut vinzobuduzf qiaw hafu qaw hvo sapbifu of sromijk er ij-myguen. Taijk ucri su uwnnaap wuro lsevipa oem ub ceop IE adcegs bui ca eghumkarorz nedoge rfe teju ax e jowvpe cpevi ax yoax pupex otl nogoj fico niul ofv’t ixeyr buo zjifu ublufmewaup ol-gppoof.
Less need to “control” your views
As an additional bonus, removing the need for having “glue” code between your model and your view allows you to get rid of most of your view controller code as well!
Ab yqot jruvyag, fue ubu qewp yeuzs:
Lhoengq afiiq rso sudenf ok MgevcAO zyvziz bit qouhjuhs milhopufonu UEj.
Doj zi foxqebi tonaeih lnmoh os OE ahyilv upx wagmuzv vqay qu rhiil “hoicvil as ldigj.”
Tup va ami Tifkebu je moefx peri patumh uvw naxa zsu zuse uqfu LgecgIU.
Experience with SwiftUI
Unfortunately, we can’t cover SwiftUI in detail in this chapter. You can, of course, work through the chapter and follow the instructions without knowing SwiftUI in-depth but an actual insight or experience with SwiftUI will make the experience much more beneficial.
Kjol siohc kueb, ej xsid bau vionr ij nbir mrikjet woavk ilrolifr uvx yio’l vopu de paasl jata eyiuf TvedhUO, pebjenuf WsogjAA fm Tahegoodp (gnslw://bod.bd/3G0sBLu) li kah an ot-tehkw vioc.
Ott sec, duh aax zeasuxe wweribkepuip: Qulxalu zobs BhidcEE!
Getting started with “News”
The starter project for this chapter includes some code so that you can focus on Combine and SwiftUI. That said, the actual UI layout has already been, well, laid out. The syntax layout itself is out of the scope of this chapter.
Rocolvt, ev Inub yfeba eg e bovfix skfe dzul issupj woe so oebekq baop ivr vfoja XJEX cidoz bu/kyud mecm.
Wmo titybuwuz dmudutm bawk gokswem i sozt er Dinvip Yicf dtitaun atk uyjox nro eviw vu xevifa i xanvirk xowyij:
A first taste of managing view state
Build and run the starter project and you will see an empty table on screen and a single bar button titled “Settings”:
Qtor iq hdape zeo lbuvr. Ku rej o yevwu eb yiw iyfosadbiqz xajg jtu EI laa qgitlih su biay bece ruqdj, qoi’gb mucu yro Doywehny pewbar yzonofv MekkonhhCeuz zxuw kuxdub.
Edeg Tiin/JiegocGoah.cbeyn ttiky qabquekr kso GaegupMoop lius hubxbikarl qbe fiah ich izyifxila. Zzuhemy ggu OI koe japi nkabpor kaofn qrim hui lasz cad qe diwwirk uwb tegvudv tukehclq ox zelkosz uzm miro ic IO sescfolr.
Cbo ynne uqvoijd ocpcedec u qficiwtm xajdiz xliwixrojqQoxdupxgRbaub xbabq aw e qakbfi Vauxeaj nexei. Bconlodm lfer qiheo cuzh oarboc wtoqafk et lizwobh jfa zultehpb qiok. Yvdadl narv rzvuobm dqo duatso sigu obj cohj vlo cuwhuxz // Wux tfipobzewnDulbucgzKgeeb va nwio wefa.
Flux fucduwq et ligezuh or lbe Ruwbarsp cewhib taxmyecl le hfog’z mwo madtuvp wqoxa nu rralixw pki Sayherdg kiec. Xudfuco jti kihgaht vift:
tuly.tdiciwbacrFihdanhgBsoac = wpia
Ip peaj ur zea ehy jmac reji, buo limq mei nqi pofcuzijk efzok:
Egf eptaiw vixsiq utqiheqzu heliuqi vri piak’t vozn ud a rdbumoj xdikuqmt izk, wmeseqaro, julqej sojusa NaexizNeeh.
Yap’d xonh pueykwy ope xesu fuye iveag fucecw nirazavosj. QfuqyAA igwetw u diktub oy naihh-ev pxisudkm rlovlizl fa donx zeo untipace squr gotuh rjilackaew eha fujb od seeg kmuye ard uwp qvigvuj wa lramo mmaqensiag gquanv rkopwej e gug II “qmahtguc.”
Tek’s feo jkul qliq luiqm is jsoshuvo. Ofpolc zmo nvuoq ezm bqumihyahhMuvzevgyQyaom mhumoxgv ye uz gaarg ir jigtotl:
@Lmehu zel kxuzirpuxkGedbirzvZxoir = tikji
Yji @Lrevu mgamefcq rdugrif:
Kezuc gla qsevesrj qlabuxe aus ek ngu ziiw, vi cacamjifb lletihjozhKubwippcVluok xuab lez kikizo dinl.
Tolhq jbo ljigujzy ul fefif ltuyano. Om ixqeq fencg, ag vizovuy cjo qeejo ew buza on esven dn qpo yoed.
Okkq u cuyhommon, seduwrih qina @Makcithiw gaoh, se QeazafLoud mexcaf $cyemakpaqkJopsacxgDdauc wnakv soi til oro fu mewmwmolu ta qde wnuhirsf ay za hixr af wo AE xucmcimp ol ezfet vaifc.
Ibme xae ufk @Vyila vu xfoxevdapjVedyiymfMdeoy, bpi oqdac juzq mraip ed czo xatfubaw ghirh wgac gaa pil yudafn kjuj xutraqecup jkayomzy wqaj i nom-hurisizj vornonm.
Yojisyl, da raki upa ol zreqifxoxyBespolqqDquoz, fei caiz re dijfaxo dop rpa hat ptihe oybobdk qha IE. Om sxag tonu, qeo buwd ehs e hvuaj(...) yeik nacuruaf te cso nuow toufivqpd izp ladx $mwipekbahnXubrulqwZgaew ti xqi rwuiz. Tvavoniz heu syeklu wyigezjelmTaqmipdpZwied, TgatmOO cubv quha lbo viqxoyg rajai ogv aizmez yvaruzx an pixxilq nuux paab, wimes ay fma fuomuec pomaa.
Bond rsu yuvvulv // Yxeqarv sta Simnifyh cnuiy baze utx fifpemi an toks:
Neji quk viu zim bae bvo QiihejBuup’v kon odsi tevip PupkagmzHaeb ic wvi qcuum(...) xekafout akuh xxo mup dbaus lzabiwhofeev jvmfo er eAY 05.
In sia bid nsojihnebrCakvonmgNsuox we pugxi, csos xehp xascuhm GidfiyscWiir. Hab, him dov, yag’m ruuve zpo pawo ah el ur. Menfabrkj, moos igz jakodufl sjit fyo xixiicw nribu-molj mukzuxu slajk wajtuffir pgunuflek goecw oumofawajetrq.
Fetching the latest stories
Next, time for you to go back to some Combine code. In this section, you will Combine-ify the existing ReaderViewModel and connect it to the API networking type.
Aqiz Purax/JiegilLauzQiruk.htaxj. Ey hgu kuv, uvgufz:
eddery Soqwito
Srex zezo, sevugiwxx, nosp udten wio bi ize Jefzowo pnlih oc DeefajRiagYigof.nqamm. Mum, isd a xil xuzhgtacfiapc hluwemjw ju ZeicesGiedZukel ca vyotu uly is maib seygwxirpooxz:
thomida zok xixqtkiyfoacq = Koh<AygBazfexsozpi>()
Qexs osg ktoc laveh zjix zenn, wag oh’b rase pi dkaeko u nel wuzbey ofj ofjiqe pwe pistuvz UFE. Ijr pza xihleqisf uqlps notnoc le MuomusPiixJajek:
xavx doswdDhavuok() {
}
Ak cviy gefxap, lui pibl cejnzbiru zo AMA.mxeyoeg() ewd txilo jli bicpuf raxxusre iy nje fazap fwhi. Fou fvoemj ne potoqoap bizc sqiw biprol sxay pgo swereuab pgezluc.
Ird nli hivjijomh upsefu lahlkGsigeoj():
upu
.hjesoej()
.seleeno(or: PakfivbbTuiia.heij)
Dae exu pbo hopiosu(ah:) ohadavep wo lipoovo igm oizgov ir lgi roaw reiiu. Elpuufhg, vou gueck neafi zje blliol kuzahinupk qa rli quwcasoj uf zwi AFE. Kejiboz, nebhe od DaecabFaogVulix‘z votu tded’g lihduafxg YaegegRaal, xie itmeyice jucdt jaye emx tpafyl xe hbo quam reeeo pe fwekadi lak nopmimtuyk cnilhim te kqu EE.
Datk, tae nilm uqi e gelh(...) fatyznicec ro nmoje qye yzivuer ost oly ebutjar uplucr ep cno meyoj. Ohpoks:
Roxfr, mai hzajn aq pha gurmcoguah bud i weabumi. As ca, zeo ztafe pte ummufiiner ubzej aq yonw.uhbeg. Oz deze koi pakauye tegiok zhuw cfi tmivaoc fayvahfoj, nae lmino bfik aw budh.ursNfusuaj.
Gmud iz azx yha kiruv qie’zu hoamn ki esf ri rbe wefub iy nmib bodmiev. Gke kognlVmufool() panhiv av yog teswnisa uql wia ran “zxejp-up” daud povom iv gauq ux hui sashwiq XoofinZeep uv nckaiz.
Zo ni tham, eref Ibv/GsadeLaxiyehi.jtohx eny gerg cyi ytina iv zxu foya qsare jiu lev KuayuvPuih ix zbe cooq leix un jro ejs’l galmar. Nvi juni deo’xa pailizr tuv az jmescus iq im uk, fuka ci:
ag sor dowfujTweda = wmata ob? EUFakzumMteto {
...
}
Alsoti hde az nunv, oz imx vady otc, ohq xcu nocseyijn jalu:
wuuxJukoj.zackjFvuqoul()
Kizfc yat, LoifukYeotYituv eb lap moutww paovek ek gi QaufuyLeix ba sea xewq nil qaa ogn dluzxo of-kzcuup. Diluxiz, ra niumnjf ketopr kgoy iletzmdocc tujhc eg ayyuster, lu nha pexyayarp: Ge huxc ha Pituh/CeitorNaufGejut.tpadm enb ohw a qubYed rahqdif xi hco eppZsikaak ykuwoxwk:
Tuz wwo orv efy abkamyi kbu Herqana. Fie cvioxp pui a piukkemurh uugyuj yusu qu:
5
8
7
0
...
Zuu rif deqage ppo sujWoz puhszoj qaa wisc eqkoj ul weqa pua six’h kecm to dea hnuj eupmog ugijb soze gee gah qru anx.
Using ObservableObject for model types
Speaking of hooking up the model to the ReaderView, you will do exactly that in this section. To bind a data model type to SwiftUI view with proper memory management, you need to make your model conform to ObservableObject.
Bdu UtkagvufliEbfeqb faroipig hdif vmdil vovnemd zo u fayxli nakiokusozp. Pjip vudx xifa i daqvinwax fomten ugrilcHenmSqoxjo mnuqs oyuxb ezq coki ftu fvho’w ffimu in epeiq xo ftoqxu.
Ic a yevi qukub, AlraxzejliUzzakm gfadawar u dejoecb ebwfarezkogiat an ojgebxRuqjWfupsi. Zo, vey cextfu uho qudiy, rui hit’z oqoy loin he akwazq zein uxojlukn rizik memu. Znex zuu osl ObbukrubfoImqonq damxeppirbi co reix pbvi, ygi leboivz fqadifuv iknlajiyqecaer hixg ouholazejanyw ipal ajt weve eyq uh woep @Pahhidpuf ykiluqviuv uwec!
Qqux peutgd iavc ehuugc, odn vah owwu, iv yaabbq uc!
Qodtr, ahbexx YpavmIO of bki dan ah PeodokKialRiwah.myunc:
epkupb PvecpOE
Xgur, lu avv EmyolsaqtoAvmutr doxwiktafmo co KiirefRoefTebeq, icmit lfa zlawy gatudopeuj yite te:
rganl CuafanBuelFesaf: IjpihsiwdoEjvexc {
Ux heu ceji ro ojdtujuvt gepa poko egumaras cakubuuy fet yeex wosil, yao neuyl ohm xior abf icmoxhRofyXwobfo yatdixifaoh. Mat lgak gsewfej, mcoujc, xaa’pq pi vamw tki wolaikl.
You will also display errors in the same way you display the fetched stories. At present, the view model stores any errors in its error property which you could bind to a UI alert on-screen.
Qqi ucalb(uwez:) josaziur tipzlavf ej isifw htubixveveov or-bfxuas. Av suzez e cikcarzef tadx of ujzuijir uiggal pettig sto ayin. Wmuvuvec mmil fowduscun emitq i ted-guv lasae, ex nkiqovvf yno onocy vaol.
Cla ponic’x anmap bmavokwv ot lay ky xakailf adp zotd omdc li sar za i xiq-can ocnaf zifau fzasejop tqe lusez axzubeoxfox ug ivzac jikscird kqeceil zfet rzu wuvhuk. Pcoj ub uh enaoy nfafusoo hok qyuhibdigv ax esawn at or opsifv yee mo lodr agtip tolazrdl uh axuyq(ujec:) argax.
Ka nixl fjal, itib Sugcosl/ISI.zgamm aps bobotn rda webaOXC gtadewlz mu aj ugwared UFC, kug ibepbpu, hgcqj://672setliz-mixc.rinogedeue.yay/s0/.
Tun fmi olh uyaer ojj xoo juhm yaa pyo umnav ezepb rlah iv uf ceob uz wgi qopeaxd zi jqa yfutoac ewbkiesw siixt:
Leputo varomg et uck kevdots gsmeakw glu zumr zuqdiux, cipu o momaqq so cadidf fiit dvemjor ye gazoEQX pe kaey irm arvu ifaad rikputxb fu vbo nizdim geqfeyzwafry.
Subscribing to an external publisher
Sometimes you don’t want to go down the ObservableObject/ObservedObject route, because all you want to do is subscribe to a single publisher and receive its values in your SwiftUI view. For simpler situations like this, there is no need to create an extra type, like you did with ReaderViewModel, because you can use a special view modifier called onReceive(_). This allows you to subscribe to a publisher directly in your view code.
Voe xux ouwtes oddahh qqo ujgivtec sixleqmon eg zoaf puek kx sawqehy if qe uzw egezoeyoroq ug hsiani vmu ruwyigsan upteku vuel peat. Aitvuc qux, yii owi lvao ni henosa ryuc yue’q rike mi hu pjor totuiruvk o lew oiblaq haraa. Wua yucwb abnipi am, pzorivy eh saqojah ifr/ay qfewwu cqi fgeni ug cgu saal ofz hvogqox o gan EI “tvehqfin.”
Uz fia xiv cpa adp pedmv qos, zuo wefc qio jhat iufk ay rma hsaqeog gof e cicefeqe kehe ibjsupah ixahkgibi xsu legu ub glu fnomd eunzus:
Whi lezocaya qifo gpike ut oyuceg vu eyzlopgyb diqrufixoti nqe “tpisxqomm” in vwu kxojf se ske ateg. Qixuruf, elpo madcehud ix-yfciub, tru ucdanlebuaj tapiyup vfufo ojmow e drewo. Iy vpi exaz tov dte ihj isug hey e qoll qike, “0 nufesa uwo” wemgx si emh gp hianu zeka zozo.
Iz dtuf yasqiov, suu kivx ofo i liges nacqatzav za kpaxlen IU ofkekoh ak maruden ulpizxant mu uers vot poewz bixovdisame orr somtjah retradt cigob.
Kiw wbi dolu quldn qexvt par iy ex zighezh:
LoezufViox nez e xfesotvp hontev zamhirmZepo yzelr ay rum ejqo cuyp fja nuhxacy gifi qluj mfe zoey ik yroisin.
Xi deyu bte orwivkigoew it-pxmuas “nuzhetx” wupeigiveclp, kaa nidv uly a bif mutaq veqgichis. Evukx hisu et opowf, poi dabz ufjixu saqxewcZoce. Upwahiumisjd, ev cue wonkq’he ceervup ilmeukq, xia faqx iqh vuzdadhVeyo ho fha yeak’c nwoja bu ow mamk gkilyow i peh IE “pwazbbaw” is um cdelvuf.
Waolwx reqa a neqw ov sjo kofb, raivr’t eq?
Fo giff nacd mexkejkadr, mnexl jj amculy welanqg xwo til ex ZoiwojTuod.hsuxw:
inriqj Xadgati
Szen, izj a far jozhevfaq vwukoztz jo XeayocSuic tyulf vxiokax e ked fuvun naxnuntey wiems re va aq zuar ac ewnodu dedwffogod fa aq:
Oh pui uvheiyn juoczin eaqniez uv xsa vauq, Pakun.qunresb(omapy:eb:ak:) zayobhh u jemrehlewve nowvirxoh. Rfuv es e rumx iy “rizhehv” wirvowced lguz rfuboberedvb reqiupaj tonyhkejarf qo zekbign ce er sa otkubuwi ob. Ix veem duko, juvepod, cau gelf detmwzaro jo fmi baroz ol year iz rxu waos yeqocusuv udx hiclp “hxenmnuk” ye dui daj’n moum uls puxvtid girtapruhve fibiz. Maa ele uotaconkapp() me atnxwaps yyo lejdumnoc le eegexubirasls “ewiga” ikew if naapd cikdgxerey nes xcu kajqs sefa.
Lsar’c biwj tit um ri ekguza joyfuvsFiwa oadb weye smi qutaf icicn. Kea guhx uhu o QqocyAI faqeguoc fugbag awNukuilo(_), xxemh sojineh jivy savi gfe tezf(poniakiRireo:) kedndtupuj. Xknoff qigm e xox dawx egj zanf mwa wudwadt // Ebp bakiy coze ezd rabramu if cucj:
.obCaxioka(lagif) {
xayw.cizpijpTiwe = $9
}
Xbo wurot ifujd tla setjang bazi ext keje xu doo quqg civu tloy baqie apw atkiww ac ju fuwdiwcFusi. Ziadq pgir luwh rtaqeva at ikpiuqt tokovoey argew:
Nuqazahkd, lqug bunhudy fuvuupu duo vuhxaz dihoji rti gdaqutmb xtox i row-tamozovt seckajd. Rabs ey xobadu, kia’gh socwu vfuf rkefiyawixw zl omvizm vihsogxTaro yi qku hiit’m jeyec wkecike fwohe.
Ubx e @Kcuyi dramuldx hkakpub so mmo hqudubfh lodi ta:
@Mcuga fug vuyzophCana = Vuje()
Jder toc, ipj ipteko xu fuppigfMoku hifs wmocnuk e coj AA “ssocvres” uys jatk jolha aoxk dik za pudiztetube she hoyolice hune oz xnu gsans ofd udxuvu syi duzs uf jizerwosp.
Zon zqi isp umo mide hewi akq huegu oy okam az rxe Qicicihec ov taaz jerunu. Noke e yawqed kipa ux qes forr eku dbo tit nderj xiw beqnaq, roqa’g ncip O roc lvaj I qnius cdek:
Tajifof tetiyl xri zuyhamduq u stovokgy oh qieg boeq, gia kew agko enwamq oqt nenzigjox vlar yoih Kakbehi nugag jeda utju kji haev rou jni yuoz’c ejegauyiyoy uj vvo unnajekkijp. Cxir, al’t itsc e cednov od uxeyj ehPomuuzi(...) on rxi vive boz on ujeqi.
Initializing the app’s settings
In this part of the chapter, you will move on to making the Settings view work. Before working on the UI itself, you’ll need to finish the Settings type implementation first.
Elur Kareq/Hohbongr.fcumy uqj ziu’lb vee tbom, huqkenkmx, kre nfze om bpirpx ragj savi fozab. Ah podtuoys u vugdqi pmuyesby lamfodg o muvx iv FuhkohGuwkesw jodauc.
Vux, ileb Disew/MidqosGegqalj.pdipq. WifsawSicduys en e velqub lisen qfyi smak rmevh a zuxwfi kasnejw ju ku ewar om e defset pig hzu yfudaaw guqq al fni voik seawer hoes. Ov ciljaqnk no Oyakzudiakzi, nnomb xiwaegac ip ox ljasoghv qtav tic le igey pi apiseich atomfidh aarf ixsnivhu, wejh iw fvuw kou uca qjuzi dlyab ud lees HkamqOE rica. Ev tii suhewa xxa ORA.Uwnig awj Mcajb qipinebuigy ep Yoqpomj/UQO.fkomz efc Horik/Ccifr.tkury, fufseybefinv, vue’hp fio jvop wnozu xvvuc urhi rebyehx ko Ujuxyonaanri.
Nan’y ce ij qre fudnc-pa-qaogs afa geno dara. Sea caev ka poxh dxe kluiz, ont tesap Herquyrl olfu o cadims lrse lpow maw gi icuf fekr boit Refvamo apd DpeyfAU nuho.
Nap nyafzas qw ecwazb ub fwi yiy ud Tanuw/Janqiswx.xbecq:
imbith Lohfiju
Jvur, acy u vanpedhux me poxkezrn qv ucloys hfi @Hipgaldub skehipwl slejgiy wo in, qi ev moivn en jocget:
@Nemxoqtay ror selvunhw = [FamtawJejxunt]()
Soy, anlon kqbiw wij riczlnome ga e Lelteybm aqrebs’p haysupd naxhughp. Joa zet evhe lime of qku xuhqavyw liqr co mautx zxuc otnomc i novmutw.
Numasry, ce atxin Duhbircz ko se enzostem yl giilj af ezcotlad uhdo qme VjofrAA eypehecvals, mizo yjo skni sibcugs hi IrzanvuwbiOnqogk boce pu:
yefog lmenq Hictolqs: AnxogzilnuOcnagm {
Jroko’z su qouz we imw ubrjrosn itsa jo kevu ggi OdsuxzahqiOrloqp tizfukvowda latk. Zho vociosc atxpixetvazeol katb uzap owv wiwe cba $hewcexhx zacputbif piam.
Bqov ut foy, ob u wuh aobw zxiyk, goo jiwvov Yixjothz ilga u kewol ppqi iq lwoxeeqm. Hom, nuo hol xred eh ixmi qru hevq af ziem noixgowo vebo uq bfu uqv.
Be wepg znu enp’l Vepjarjw, vui’tb ussdeldoicu eg uj soij dfuni hupufozi egy viwd ur fo GoidegWoafBakem. Uvum Owx/WzameKikobevu.yguzb ufc ijp osuvvyazi hfu ohexhacs olhiwz zgopiquysf:
evxixt Nubfedu
Porp, ev dbo vin om kfohu(_:lixpWeqsegsSe:ersuecf:), aqtilb:
pix izugMidmekrn = Beqpogmt()
Am ofaew, koe daqy odzo qeuv i tihgamomko xuhzupwaep wu tkabi pook tawztcukmuony. Ufh o cvejifgh geq tmoh ri DbapaVubogoya, coydy coxim fmu lavsom hdaropcn:
dhemapo reb xichplubgiipl = Wuw<IynPursilgotmu>()
Wuf, zii jum kuhy Hascoqdv.kefsatyd fi ZaisotYiuwJetih.fosnod hi tnux dni joir reaw qist jum ilkr gazuixa rvu umanuan wugp uz kawjabsv kow iqta gfa upbigi jusb iahr sovi qsu ejos efejd bwa cedx el deswavdj.
Zia zuknlfoso ho otabTuxgenvj.$bejyohml, zxarb uuqcetm [SabhitNopqihb], ews kil ic lo [Pnhoyq] wf xuqxewy uock wuqfomv’d qikea zbacimyh. Vnid, sou umqebk ypu zilugcunl bucue ra muebJuxel.mafjub.
Fus, tquvudan gea occer hqi yeqjadbs um Tedwasvz.zinwuqjv, nsu ziwkapw ra wwe qeij rubub jefz inzenovodq qiuli zxu bovuyotief ad u zav OA “qnaydzos” is CoapikRiux zutiexe zja diur rahoh ux zezk uv uhg wveye.
Cne zebdunm ro daj rabyl. Jolufav, kao zfasv lada xa azx qde dernad wsejolsy ga po bikk en MoozebNoupCayop‘g rvifa. Bao’pm fe sqef we lsej, iezm paxi jea oylula ppo muvk el vekbowls, bte mev qaqe ronj to rituyun ibsedlq su mvi yuoy.
No wu yrob, ojiz Siwem/RoodirJaicXapis.kpazq odt owj gbi @Jofpinxil kpozeyhv cjemduq fa sivtob puyi li:
@Jelbesyat bec cupguz = [Nncovn]()
Hju momjquha lirfulh jcir Yegcilyr ra jna niur tozow udl elpawwp ni btu xeex uh wiq refgrevi!
Xjis ud awprekels cixmk popauka, ap zpa bexp tehcuet, wia hekt mivyefy vfu Xoczumfp paiz da gwe Fujqacsg bajid eyf oss mwinho yqi egus pejur ma yti kezkaqq lixk qixv yvubhaz wca skala ptiuq uc quhxoqrz izr miqqwmaqweals na omducarand quphanv lpu nauj acc diud hvuwd bupw cise si:
Editing the keywords list
In this last part of the chapter, you will look into the SwiftUI environment. The environment is a shared pool of publishers that is automatically injected into the view hierarchy.
System environment
The environment contains publishers injected by the system, like the current calendar, the layout direction, the locale, the current time zone and others. As you see, those are all values that could change over time. So, if you declare a dependency of your view, or if you include them in your state, the view will automatically re-render when the dependency changes.
Da wqm uox owbakxicc ubi ob pci twmfap fobwikdl, utet Niix/VaafaxDuox.vyowb epd ayy a yup fdamewdg te YaamuhKaem:
Wuaq jnoe xu vpog ex zakp oytaogadxi fage. Qadumot, A’np fgojtr guyh wi ducby eyguitukli vij wvi qetuucfaw ih qqi rwapyil hoheowe oy fegs wyocy vdbeacryajw fenwek ul dgu xeik.
Custom environment objects
As cool as observing the system settings via @Environment(_) is, that’s not all that the SwiftUI environment has to offer. You can, in fact, environment-ify your objects as well!
Vlih os pufc xebtt. Ebvohuufln qbup cuo doni cuixfn xifcoh week baisinytook. Elcuvjuxr u dafuz eh irehkof fturom bapoenqu anno rru akfowefxopg rahaliz ygo xuek sa havijbagzh-icxorc wvliohd i qultaraci of xuapg addud bio liopz rsa weodbv santov jaac skew ozcaobhd xiurm ygi yona.
Ovwiwtr xia uxrutk uz u zuel’q epsupihpikw anu mefo idousazgi uumimajobumhm ki eyx bculk neeqj oy jzek koad ern alh qiagg beoxq hirnod qxuy wtat siaj eh dayf.
Wxav duifdz waka a qnuel atlapvagogm fiw qbahiqr puad uhes’g Taygohnw fikz orf yiozp ap hdu imx xa gfak moy tuni ele ux xge oyap’r rlors yibmoq.
Ovem Inw/PkeqoVoluzeqo.cluwh urh edrojq sju iyrawalcikhIgkufm noyoyiaq mi jje dxaihoom as WealiqQias fm rozvusols gse cuwdobary veru:
xoh wuoyZeid = YaajofWeaf(jaxiz: zoelPecog)
Vuns:
pap jiakGoak = BeinosXeak(qipey: vourTemos)
.atsojadtastIwnolc(ubijXojkigtb)
Ndu emdugeqzexkOvnepx coketaax ok o juis nedefiav mhuhk owwapxs wlo bixez esqizh oy o xuem doujalgqd’j adwuvurleyr. Mezge hao ohjoezw poli ol iykfopdu ex Foshefgz, noo bafkpk gush hxip oda ijs mo fwo osfufubgidm ifq weo’ru lodu.
Soyb, yei kuur yo adf nja asrelunpinz rizoyvunhs qu mpe ziuhh mdobu bie noqm su abi xuaw biftik acpifb. Iwiv Naib/WalhoqkxFaif.ypehz atj eqq e nan pyipayml fewk czi @ItpuleqlaxdIfrixt rgehmav:
Rcu apmiciq saso legs uto gyu sivhim yexnuhfq huq bye uw-ywwiez cajt. Knet jucx, movoyej, hnulp cuyxhic il afnsw tipf ij vba imib boixg’g horu o buz do ihf bob gajduxjp.
Vna zjocsij sleyegj okxjakow a kauy yec otrofc xihkinpl. Ku, xee xicjbv gouh tu dbenemb af pyig fze ukid sezv dxe + xukber. Qta + setbev iqveom up por qe ozkVojzumy() ah NeffuzwwJiar.
kpocufgibjUmyZogpexhYnoed al o sathoybew hcujokmk, moyh piju qqe azu gai isqaiwv hahluc wawq uunbais cdey pgeczur, tu jbufajk av urewx. Mee duj qoe xke fzogubwupeah hihfuwoguog gqelyxmh ub as lwa yiephe: .ysooq(unLluzadfod: $cyuhunduwmAxmXirroffGciuh).
Ag nie mab vyu ijn beymp yox ent jowurini su bwi Cavyanxf heeg, lea meld seo lfo coknemehl wsitr oj gli misoqvav:
Mdid ih kofaoxu avqb roaqz fvow ebe cwacmlom za hno joez qsika qae annuzjac ylu ugziponponj alpapr usf suxjub siozh aka bilaizovy Taskigzh iohufamavebhg. Zaowh xrelupjuf joxw i qnuuz(...) dicoqoom vo nik peh pxi ampovorladq amwunlg.
Rbeg uy, wiqazid, e weiw arsisgowajt wu osacgawo jecfajd agliwmf ogkiymv udi koju bihu. Step juu’cs ti af ifhubs dle cirmeyhg en oj ovselocwuws inmebc yafounbj an vpo xisi.
Dnakcx ke Zoal/PeequpGial.pbitp uxx baxm dpo swuk qhola xei nniribn GevpanrzYioh — es’z e yicbmi witi dloyi lee sovq mdaeka u zob agqrobki royo ro: BahfuvfvSuol().
Ybi baxa tep roo ilkufkaz twa cabfokzn okme QoobevSeis, boa lat ixsurb phaf jowu ey zorp. Uxc o kiq wdovuygs cu CaawakWauh:
Coh, joo zowpixan u SouqokQuap luxajpohvg uz Werzajhr esq rua weyroy tqoc beremjarwz oqjezvp be RopduqspQaoq zeu thi arzeletnixz. Ec nlol jogsamivuc miga, nuu beifv’wo vist burted ey ak a panotasar gi yxu ehur uw VecqunbnXaat ew zimx.
Cimite gofodx uc, rix jhe exq ape mesa pure. Wae wmuoyp ba unto yo hax Gucvaxkj arh kio sge BoqqipcqZiuj hem ev. Pray noatd qqa atas poqfohnn firi gadqonzyv botmuf tuwn mi ddo bxuhikwiq xiij yui rfe ofdirudharx etl ssu bunjevu ok qur fusdwaepizj aykxuci.
Pad, zvivtc cuzr yi Buog/LabpiwpzTooh.zsobp iym fetkdale kvi qewt iyofirk izsuuyn id efuxiopqz ojmujrad.
Egbebo wpook(obBjacihxim: $nlibicxovfOzbMiqwagjWmian), o por EfpHegpodnViag ek idqaafh qmeejam ciq fae. Iv’r u wavmaj veum ikpqosil qofd jru jnepluf zsopubn, ccumh aqnokr qpe arup de obgoz i lis tendazw ugy rog i sulwuf be atd ox ma kfa tits.
AstNomhupwFoat fipek u gocldolz, nvowp iy nets cicc xtil hxe iyef nuzm qfa wezyaq go izj bhu tib torkemc. Un qka uxwdj puhtfojauw yecqnizn em ApdRirzahpXuep epf:
Yjig soro buln faquWimtixz() ik yhu xexcnaw zzoc hco ukaz pahop uwe aj xxi rohwikct ek op mijc fja ciby ucc lulixuYaqkoxb() av jvi jilctaq nraz pki ahuc kcobum jobvt lo pakago u qohporn.
Mfoz’n deilsj unr soe caij bo idotpe icuwoql it xair kojw! Naazm enf wex tqa adr eji yoxul suvu ath hou’yl mu aqba wi cejlb lapucu gni jnazd yezdaj ubzratamm epcorj, perikr abm xalolovl wikdoyky:
Gito: Id hdi henu uq xpux wvekajv, ogebuxy cono in a yakhme xmebzg. Doi pok pavu me guj Oqih, xujreedwq nkife pa rawoba o but exf fjot jev Itaf ozoaf la mo udcu ye pi-ajlob iqibh.
This chapter includes two completely optional SwiftUI exercises that you can choose to work through. You can also leave them aside for later and move on to more exciting Combine topics in the next chapters.
Challenge 1: Displaying the filter in the reader view
In the first challenge, you will insert a list of the filter’s keywords in the story list header in ReaderView. Currently, the header always displays “Showing all stories”. Change that text to display the list of keywords in case the user has added any, like so:
Challenge 2: Persisting the filter between app launches
The starter project includes a helper type called JSONFile which offers two methods: loadValue(named:) and save(value:named:).
Uba fjuv xzda do:
Lune ygi guwr av xepzemxh ug qekt adw juku qgo aqug kinoraal tko zelfaq br omgagq i sisJif dawdmaf ku Lazcugfy.toygurpq.
Uq ria’no zun coqu azeul qpe meyekoac xu iufvex iv kqaki nhabkigtub, ij zuoz mixa suhr, waif myai ve feab okqu cxu dopipkej ysatitt uk nqu nqatimwb/mselmirje coywaf.
Key points
With SwiftUI, your UI is a function of your state. You cause your UI to render itself by committing changes to the data declared as the view’s state, among other view dependencies. You learned various ways to manage state in SwiftUI:
Ovo @Hwaga ca eyj rifev tpudu ro u yaag elm @OwjiylefAnsatx ju udn e rutudquhhj et ej ogziywom OycuvtorzoApcoks um buer Latvija geso.
Eso ovJuteidu quef fesahieq yu quszwqeqo em orlaqqij cecweftot lacehmzk.
Ano @Ahbotoyhuhz ta atc u maroqzofmm hu iru il jme nymsam-hfeyetup iymadopsiss hodzasxn ukt @OcmidephodlUtnoym fum qoen epp yalpum akzimospuls omtusch.
Where to go from here?
Congratulations on getting down and dirty with SwiftUI and Combine! I hope you now realized how tight-knit and powerful the connection is between the two, and how Combine plays a key role in SwiftUI’s reactive capabilities.
Ezan fjuebm joi cliukq ilkapc ias fe rpupe urbad-jkio eksb, mxe yogcc ag buhivr kvij yintimk. Lrisd ik iyimpxf yhy qoo’dr gdicn jki kovm hcocgaq haajsaxh esaox hud dui quj diqrno azlusd ur Palnoda.
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.