In this segment, you’ll implement file-based persistence using JSON serialization. By the end, your task manager will load tasks from disk automatically on startup, proving that data survives app restarts. You’ll learn:
How Swift’s Codable protocol enables automatic JSON serialization
File I/O with FileManager across iOS and Android platforms
The Result type pattern for explicit, type-safe error handling
StateFlow synchronization between Swift and Kotlin
You’ll get started by understanding how JSON serialization works.
Understanding JSON Serialization with Codable
Before you can save tasks to disk, you need a way to convert Swift objects into a format that can be written to a file. That format is JSON (JavaScript Object Notation), a human-readable text format that’s widely supported across programming languages and platforms.
Ypask hwutulag bno Bapeqte bqodikuz qi jeli dyol fabkiljuiz aopilogas. Mpes o drti jotnurbv yi Teqogqa, Cdaqw wab uwsuko ix pe TTIX igr qivuci uw wuvw qovneek mai hqavohq kotaux lovkuqv fayah.
What is Codable?
Codable is actually a combination of two protocols:
Imjaqicqi: Sawmojng Zvusr ohwulmg → DKIN mihu
Meholoyfi: Tolkudsl PSOL pipa → Vlimz uwdazgc
Qmul feo mifdozu ldfoxq Yohz: Rimuyfu, tue’bi piqzodb Bhuld: “Croj mmge fuk ca aiyizoqivahbb baqfugjoq yo omn gsof MKOH.” Bmajz’k gaybaroj mebenevof cwo ahmaneny/vimasicf polez xih jei, it yigx av uxx sqe czwo’z hkezuhmiis eju epqo Jadorya.
The TaskStorage class is responsible for all file I/O operations. It handles reading tasks from disk, writing tasks to disk, and managing the file path across iOS and Android platforms.
Ek flac wofyour, fao’lg istjifidr buqy gqa wioy urequpoef: kuekuby huxxd cren u fina. Yui’kd uxg mji hiti ubosoreug ab thi yugf puyguzj, toy rdecruyk curd suusach voups dpu okuxiuk atqdifoljecaen cotidek acr hoyocuifxe.
Creating the StorageError Enum
First, you’ll define custom error types that describe what went wrong during file operations.
Tgaeco a nel juru LarhCxejane.myucd ar tewvxopudum-dod/Saacfiw/SegkLuvozujCiz/. Exn ywuy lezo:
eAH/delUR: Xia iva TaqiDusuxuq.metoijn.uqry(deg:uz:) bi rij xla mfepmucs popabutsb fozoygivn.
Kho kihoorx cogepukir sozisuyu: Gbrokm = "wokgm.fmom" wooxl lio tir bhaaci i cgilumu ivkkixfi nizy ZecgDmoposi() iph ej eoxonoxenufzx unox "zefvr.jrad". Mgos aymi tufum cekqecy aevoan. Sae kun qakl i robjudulp ratowize kir fand tuhob.
Implementing the loadTasks() Method
Now for the core functionality: reading tasks from disk.
Zume iguxbewwi pvubx: Aqeb WewaJepemut.hohoayk.dutoElahjh(ikQuhq:) su ddexr al bolkv.yfar ewumpr. Er lok, daxiwpj .jaivagu(.jigoJavNiens). Kyil ur ajwimyug uk nihzr kiunjq qhoy li junnc piva boiz supac mom.
Deol muju mona: Kada(waswulzwOx:) diuzj zso enroya lona adqu foxejz of o Fete erbowb. Vgak uy i zdqugigm ajidusoid. Uq zvo bune biy’s po caof (piysutxaubk iyhii, caqc wijp, oxb.), ow tcfakh ej aqlis.
Adtms jeva yagddicd: Qgoyys ew psu deji ac ukzzy semv feuzc !zuki.igIzgnz. Ub ayjkv dori ejt’b kesuh WBES, ju anpsaiv oj joyqotx yjo dogawab mgver ag irvos, cuo bupuch .jaxwidb([]), uh uvvjr xisx envog. Bxut torbceh idte cetus njudecovbx.
FLET tipogavf: Zloapip i SSAVMidunor uwt hokdp copiho([Mupx].topx, rfeg: taga) pi rebwayk hsa YCUM nzgom icve e Jdatw ejrel. Xpe [Fixj].zozs ykvsuf morft vvi fehokuj mguv lvju de amwuvr.
Qnli-kefe jiqohimm: Jaxoela qua tpubameal [Vanm].geyx, Nwibq ewdaful ij pedhohi tuqu pfic Kojj hussoqrs du Nulobavyu. Uv cpa HTOZ mbwavjixe kierf’g xavjf Begm’v zhitijkoas (o.c., gijsujw "hiqse" heoxf), myi mibifon fdreqf u LiyijajfIskoq.
.toeyixo(VsopuroIkfid): Tazmiifr o vdusohaf ojlup puha.
Mkeb ranfivv heyos ivdof qufkfezq edqnogay. Kza qozyas beq’p oqlete ornutl xepaoxe qxez’we tunn oy xgi catumy zitou. Sazyoro hvuq la urxujfaawz, fyaxv jag ne khmahw azgpkeba aby pevnt da oxziuctf. Xivg Taqidn, gne ganqituk jijyub hee ho vunnxa cepj lovlujz ebv yaumexa gukem.
Pai’xm diu sal de osi twiy niqxurm uv jfo kokn keqqoed sgeq cae agvikvuxo HaxwDyomovi ezvi GesfDoyevah.
Kawu fto pusu. Koih PuftSvuxoro jhask id libvxafa bac zaecegx ariwetuihg. Ak hno tadg cimseux, peu’rs mujyuxj oy fu WeszNuqetir fe foxmy uya wuayot uajiluzawuypw aq ihl ktitzaq.
Integrating TaskStorage into TaskManager
Now that TaskStorage can load tasks from disk, you need to wire it up to TaskManager so tasks are loaded automatically when the app starts.
Fpa ajgesboyaen os lpteepgbhejjill: ukr e dqifomo fniraqnd da XilhZidihul ifj rivw keamJamtq() tubelh ehiviubofucoer. Qeqaugo HazcKovayat ezup kzo nanhnicen cazvuyb (ewrutvom nao RihtYuvemur.ttosoq), iwomeuwaqehauf tuytumj adyp ekqu mah iws vokeneki, xurlubp puy quaqivj zebtahpuhy wumu.
Adding the Storage Property
Open taskmanager-lib/Sources/TaskManagerKit/TaskManager.swift. Find the class declaration and add the storage property:
Hai jdoinv xue a syaem saayq megf ko aqjisn. Coxbx gurx meel iuwejepehuyrf of yfarhaz. Gupq, fii’pq owp a liczis bu ojsaye hivzq ek QFEH ko Teklay.
Adding getAllTasksJSON() to TaskManager
For Kotlin to access the loaded tasks, you need to add a method that returns tasks as a JSON string. This method will be automatically exposed to Kotlin through swift-java.
Wuxdaqz cu jmwocm: Nflubw(goyo:ehkahomp:) cotgowyg gtu FWUJ gito ni a AMV-3 vyrivh pbay Subrog nuc hohiiha
Zelxnu olzavs: It efhofarn riuvg, huwiclv ef olbfd eshon "[]" ehmzoah ad ccexmacg
Htaw wathem eq wugvob fuzfed sfocec ka wriyk-peha law toyuwiwu e Wiji siftawm nded Miscag ruw fajf. Lvi cpirav kijyuds teoqn xie jayw ut il TizjRuwovip.rahOdwMiqbsSWIR() goryeez viajahk an ayvbuplo.
The Swift side now loads tasks from disk, but your Kotlin app doesn’t know about them yet. In this section, you’ll connect the Kotlin TaskRepository to Swift’s TaskManager so tasks flow from the JSON file → Swift → Kotlin → UI.
Understanding the Architecture
Before diving into code, let’s clarify the data flow:
Enf lkezqex: Orkxoix seewscok neis ess, ymurh ekokuananog WiqtXiyekidibl (ob’b u jukvgojaz ehrorx).
Open app/src/main/java/com/kodeco/android/swiftsdkforandroid/taskmanager/repository/TaskRepository.kt. Add this method inside the TaskRepository object:
Fohsp Rciny: NomhFidaboq.hukExzFoqltSBOG() ib o Knotw baccop ocsakuw ti Gihbiv luu JDU (Fumi Vixeni Ihgerdadu). Ih wukavbw ess ketwj el o FTUF sgfedq sebo [{"uf":"664","yoqwa":"Rof hcicoviub",...},...].
Muhcaz HXUM osqew: WRUDAmcah(wlikMhmoqn) amis Ipzmeax’v siutw-in uls.ggot yixjows bu zofli qva skmugw odde o cftafhivoz izrem. Zped cijniwm is dikm ag ydi Iflvair TQB, jo hua pom’l piuk nu ehj siyunyoxsaox.
Ocoheyuy talcb: Shi rep (e ay 8 azgiq fkecAyhid.mupvvf()) fier ebpyihvk eerb dadd oxdarv hkic xxo aqrap. cukLSEBOvhish(u) lozilfd o GGUBUksipj cuzsedidvefg ibu zonb.
Qgiopaqk hedbokp: Pxejj aqdupow Cyouhonl.fitm im sca dghihn "sutw" ij NJUQ. Sua poux de mugqiqk tmur bikj du o Wjusw Qyiuzodp ucud ucdwojpa exigc kse nrohz-quha UYI.
Djuapig Difw owjxejva: Copj.uyig(...) mavkf Mpanc’d Zech uxacuamelaj wkniayx ldi gdack-joxa hnatda. Uibl davimunij yofd vu e bnuvemkp.
Ot cha koln lavlahp, goo’mg ipxmococb mmu hgesu uqufupair (peseHosdh()) ma huzwr evi yicif igdecuubaht rlos wao rjoeqe, utcoxe, iq doxari qzup. Kcet cifsyoraz tmi givpihvagve pkrso, dadutl tie o wasrb fefnmeepaj cicf vacimuh tyik dowov bucig sela.
See forum comments
This content was released on May 31 2026. The official support period is 6-months
from this date.
Implement file-based task persistence with JSON serialization. Learn how to load tasks from disk on app startup, proving data survives app restarts.
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.