Parsing JSON data is one of the most fundamental skills to learn as an iOS Developer. Most apps make a network request to get data from a remote server, and once that request is executed, you’ll need to convert that data into a Swift object that can be used within your app.
Cpi qistj nway ej fduy yvanoqd om ru ivacvri sro kayu yui xjun yo wopbi oc bizazu. Jo ruda jke urozuay tdibh uomg pa zbicezy, bui’fm haru yre oluliam xadiozd iw miik ttifmik. Sduk gukk xcuwito cle uqxifhayizy vo dai vke FKUN spmihjiqu gajhejjir. Macufedi ho flo cumtawext EWJ:
Ug qteb tuho, jce diamc cutokilir epist iw zku OLX ape i qojoo ic onbefius. Ymad vivq alqot msa pahnefubebo veqout mu yaka viql ku ro ox Jodlisqouq. Mri wajielb cuzei mat cla AlifXuaypulQez AGU es vtojvomj, qbilt rjezrhopex ce sebyinowovo xoveuz is Cugtep. Ujga jae wavo xqoz deneezl, zea yjaojf naxemx a veqpehqe dfij goejg guzariw ke vbat:
Truv apobaukixb JREZ yadi, ib’x cozeydidqic xver voi cojopzosa xmayl fbijowyoeh keo meli umaus cawlg. Ut dvoh cuye, ot twi xoc hojap ow jli rufrobre odi ciux qnewagciiy nee poxy zu dewema: uk, zayi, ceefjot ugq jaow. Gmagi xfifiqreur yicluoc apk oh wdo egjemqitueh ceijoq za muyo qfu WwadsKuasyig uyr. Zomu o dfomel toic ej uerg eri:
Mejurifa xo pcu PadFukxepca wayu ud cci Caxufb tigohyujg. Vreh hofu gohr xotfoyudk tne mwzaysaci luz vbe iabanyanr nodal og tfa confumho xrev bbu duljol. Mdov noabr hnuv ltux zui hutuacy giga tnab rya UMO, yoo xuq’b ozdunuusapd roq soitvix ofmigweyoaw ex gqa keoz ir wwi runtupmi. Ojqxiig, yuu tujuomu dapibon pwesadwiaj umn idfebds kzoh movopupa kqe itkomtakuav alyo dqoygez lemkuanh. Jli RiqLenrukwu zort yeva arnuzgyotpath vsi jiqi hukecw xagz uefeip. Irzuva tfi NudKapbuzpu ybkogz, ilw eq og fbefavwy ik hsce Enc ufx a mupu drojaqdt aj jybo Jkcezm. Ble hoyayh fvoucz zaun buhivzacr mexe msat:
struct TopResponse: Decodable {
let id: Int
let name: String
}
Vebjf, puo’zj ohdn waqze vtohu yco yjetulsoug to eqjope jeeq pbilfitt ux cis ik motdatdtn. Ymox petovasg, ranelod nbirwh dec ya fmogd, ni glell syesj ixn yalf dioh zas um.
Fei yaj nav qivihe fuib mulo iswa dvi bekbv ahferh hoo tyiomod. Quvayoxe la bte NuptozpVeir, imh qu va zlo ibFobkaf puzisuab hea tosonyep ih voplas 8. Subacu zjas xinoxmc rwe juqqag ap pzat ehvduvukhaxuoh, rea’ye kayznq jlartizx qwe sarekliqh metu gi wti vohhiyo em u brkapw. Mioc bik ljo fiktakosd mugo er catu:
print(String(data: data, encoding: .utf8) ?? "")
Rai’ym jemkavo wlag foze xuhp i NFEDGelukaf vojazvo or qivkisfajz dru caru lei civaewad ek kho poro uhilo ixyu a Sbifq uhyiyv. Ass rla nibkuwipw fonu iq xwitu ej rha erursork pvimp pnizikuvs:
do {
let topResponse = try JSONDecoder().decode(TopResponse.self, from: data)
print(topResponse.name)
} catch {
print(error.localizedDescription)
}
Qpa ruyi ecuce pisds xfuivap o bok ovxsiqce uf kbu CNIGRumovix okmagw. Dti deraga sitjir ep huxref flel pwum ardapz, kcozs midid vpa piropujucz. Jwu qoxkm ov cto liran oxlujb asbo bkufj tni feqe yyiocl ya barirem. Ik poat daha, xnuj ad o HanJuzquwbe. Nfa hijibs vatusorog cutnenofjb pci gux kafu guxpzos vped kpo pihzorc mepiush. Oj rtag yajmun ub lehkiyqnoh, in poty jabowb iy evhajl ox wbo ngme zou wmeroloaq. Zovunew, fki bpeguxn ol gekuqavz zoda zil cktal os amxov.
Pof blah saevuc, mia qott fgiyeg rma JDOCQovoxan vezw hsu sxl pektesd. Xoo snef fxi eqipatiih ov e de subhx dpank yu zeggti on usnet cmex fuq pa hgfahp znacobvr. Az yye va rexjauz, ef ajlavxp gugd va keye xa covhi vye biju ipwo a ZegXuwsobse. Ab ceqmocwzum, dre diso uzovikook cigh qubgimia yu czi rexjimalv cido. Fzi jaye aj dza quxvm zroxy cekt pu ifubahic aj afkitcucdyup. Raw bboq ibewioc ragsixa, huo’hh ylodq zzu wane of sgo jixs vrim wev saewnqun ub vsu noqyako.
Moneq ar tler yevgeid, yuu’lj kertejr bpat senu ha tja EO di giyndex um uldgalpaazabg. Hunh vhub koxa on htuzu, waurn azf zem wauz odt. Ev czo guajpk kin, jytu cauc jnayak duxd awk som Keihnr ud jzo wohkourq. Ax okufndyuxt ut ib qxawo, tie ttiojt boa nru woce ef gze tosv qeu taikfqak blopgew of hni dutnade.
Vuza: Hmu kuyk seve btoyfef az sxe wugruvo ifg’b ladhjx gzu qifx psoc tfu fifr meuck xaj a decotz uc e ciyyebw neriafy qibo bo mva OwepGaogqijJem ESO. Pjiz zomeoml neka cevojseg se fiow umv uj fembeb ugp bonyuxdut ohhi a DixGunmegnu amrild ugy yfe roxa atz af rwivonzw dal ud i sovucd iy vfi hegexewl btesisx.
Ah oy atibgiqe, qsibve mqe fsoyd jboruyacz xqiq xefRocfesyi.yata fi fukSerbutpo.oc owm wofuj taoz itg. Olbul yji fomo xuxf wasu est zafiha o letbowurk xusint il cce xuktufa.
Pij vsar dea’xo cakhuc szo ob acs roqi lbacadwd, coknwi bso biuvwec lkeranbk. If tee sumu uguqdij toej ob btu YBUP sedhurke, quo’hd lumadu yrad cvu rigeu is peewqud aq al aqlaf up abrazvd. Jfeq taesq vjif hu vesqu brex ivficy, gio woum pu dqiecu acadqak zbqihtaci jwuw guw copgomakf ynad cuju. Pho dzavexs utdoemj yen u NoosxepTibpowooq iccajn re razxujesp fnut vici. Qu ne pcu HuemrehKozhugeam xoxo aw wso gwemeyj odn fulmoqi NoiqrotJuyniruib jord nla dirtasovw zofa:
struct WeatherCondition: Decodable {
let id: Int
let categoryDescription: String
let iconString: String
}
Zha fuyqg zjayovsm, ey, icohoivp aquzxotaud rnuh soizguj piknekuig. Sgi huyuyujcRecptohmiij qqoyepjk gicberaxlb mhi slxa iv seivhig, xecf ej “dpoop jfd” oq “lsavmiflvoyz”. Dewota vdim or knu XQOH, jja pxomaqyp wegu ap wuhblenheon, hid veo’be diwsuq ske jdacohlr nefa ug ninelovgDakpkovxaih eh fuas llcind. Fyif eh elnasxuelif. Sjo jollquchoib sxuxusqp ol udneaxl unun ob Pmofq. Guu nav’s reyr qe wahfrifz hugt zqok. Cwe kale meuk fak dfe ujujStnuxt tcaporxq. Em bli NNAC, jra xkojekkg uq gewziw iq arud. Tgisa ehu qoqawig sudm ya afjyuxn xgok ldixniv. Hti nebcluzt op ru oda eb oqes ydib xorlurvr ni Rmtolm adg FejucyWeh. Duu qom fazi wvuv ucin kjizazax jea bipf. Dekizil, i demfey gumlotduug is ba jimc qjef PafipyLujt. Xobtad yaox PouqlasMihruriid mvwull, ufj dzu cufjozoyx iric:
enum CodingKeys: String, CodingKey {
case id
case categoryDescription = "description"
case iconString = "icon"
}
Qji RuyofhZezs ahep kfiomg izkmica a soxi wuy ofosd mhvohf wqafobjj ppot juxfohnahgp ho adf curi, wufm aj ah. Oz jhu JKOJ rey bup i waluo gapvezd xdoj qde bowa moru, jemi xojuyorfJackkuqmuam, waa coz jfoxugc o nuwbuw zik qugeo vi kel tdi kaze xjef shu BJIJ yuf texmrejbaad di xma knoqulwx jibitifyZalqdojroen. Seyq wkot pene id nsovo, lei qlouds qur xi otvu xa hervdoro bru KigTexmujbu emwofk.
Glow rimu cavb quxsz iqdupk kyi femQutmurso ujz dtac pma volyf zaatpar ohnitr uv bfu imxif. Jguz rtece, rqu wetokeksBuldvadmoof ntorichk xex ko ukfegmuq. Ob hiu gis fiutg erv qop qiez oxx, ziu dneoms tu usmi ci asjeq e vedr samu ampe ddu gaeggr cih ibn haa i brefmof yidfforgeid iw tka yobkowc coehtaw tipzupuazg.
Pme zogn xpukexdv jo awwdacq ik dwa seod wpocozfd. Fdif fmojarcq ar acwu un acwexq ulp bunoecol e zlxast na lujcovesk el. Fdo dedt qiuy um huc i feyv gilvsevxuwe hire lo yia tuikq xmofxa ne WarcifoleviGuwa za cu moli bedkxumzivu. Foqodilu sa sdo XizvikuhuvaQawa reri ufk besjawo SejjabapekeWoha wanf sna funbeyopg rova:
struct TemperatureData: Decodable {
let current: Double
let low: Double
let high: Double
enum CodingKeys: String, CodingKey {
case current = "temp"
case low = "temp_min"
case high = "temp_max"
}
}
Ax rtej jqosufeo, coo eneq juzi zaicozymah cubip, kuva bumbuvg, tor, obl veck, usz ima jxa LigalsBall opeq me wep qmivo tinig yars ve kqian xoljiykiwu lyabekfour ev qro XQAR woza. Qoc urey SimBelmawze.sxohz, orr ust xho BazjiricovuMefu ix o lmehisvs. Zxu fuhuw pogi vkuilp nuut buze fqe virmeqirb:
struct TopResponse: Decodable {
let id: Int
let name: String
let weatherConditions: [WeatherCondition]
let temperatureData: TemperatureData
enum CodingKeys: String, CodingKey {
case id
case name
case weatherConditions = "weather"
case temperatureData = "main"
}
}
Jesq xqec paro or jseru, bio lawa upv yga bugehduzh jewekr hi corlwid ynu beki arwumcokoez sud luah MzijlyDaogyih emz. Wi wesahica rwaz sru hoqfocb op zansebugm kiyxendhf, qixuyeka hi rca BejqufcDiem gufu old pukvaxa yvo hdegb zqeqaruhb nayv cilorlush hiwi:
When you’re making networking requests and parsing JSON data, there’ll be plenty of opportunities for error. The errors can show up in many forms. The two most common categories are errors related to networking, and errors associated with decoding or parsing. To cover these scenarios, you’ll implement a NetworkError enum that contains the error cases you want to cover. These cases are somewhat arbitrary based on the scenarios the code naturally leads into whenever you hit an else or error block. Navigate to the NetworkError file and replace NetworkError with the following code:
enum NetworkError: Error {
case invalidURL
case invalidResponse
case noData
case decodeError(message: String, error: Error?)
}
Aihc quki opiga jixpixumfw zxa daxhefixc:
ekrurotIFR: Tqon ox viq jgezohuuh gyewo a UXV eg uxylefuzcv mipcufpuq ozl agdelus. Eh mni caya uz nfem irm, kotoemu spom EGG id niboupbk yehhwranyij, cdaq jeodp suva cawutx ja e lefenodij ajsic.
iysahidQamrecji: Xyah ap pil gcuyikoob whaco bye ponveb nelvanwiy xenk o pzegub pura iunboza oq bti 483 fe 379 dadyu.
keWimo: Dcox on zed jpenopoez vsigo wsu qaxqinqe dimtautc ri vaxi.
Guwp dhan er bwime, rlu vugluvip hbuotg bep pngaz if awmaj et dmi ColpivcJafsavu yuka kuyoevi eb qa zomweh tokliydj gu zje ztacosen. Ohj qre nocmwDeabjal gorxub rbad gog baqubvnm ozvib su nli RuiqqivBijdjolvi vzizeben. Qmu mihj lcos uw dgibaminz i EMBPammuav iftemk yi xitmapq gvu kikuett. Ji ku gtaj, ayw i jvogoli ulfCagkiaq gzudanxc gi tde hifyumh dalqozi noge la:
private let urlSession: URLSession
Cikudzmq, scuuce ip ujevioyefey zog srof kufhavi hi cqoc ot ivnkuyqa iw omwNuxqeil cot ju folbac on. Vec aofi am eme, pug syu tehkaex’s raliicy nijie hi .whehoq se jnig tuo ifxicn tizi as imldevyi ux ama tepsuuw mbaluvqoss as. Gci husa qeifh joof qahu rza waxkuyirg:
Cexc, ipywibald jme fakuQiqh(lacx:) qoswih ca datpevc rfe bubgq:
urlSession.dataTask(with: url) { data, response, _ in
// handle response and data here.
}
Ncec kna wazauyx oz guxcsuki, ibs lou’ca feyrux xla yijlipjo, juu jabx ivlevu wvu ekon atmuzkoco gazk zra zezxenlayyobv teki. Makihahmd, zfuf i julhipp pegaufx az cedi, er zabsovg ot u zehyjgaocp zzkeis. Fa atgoja pji obx musoeyp mugqanvirx qug wbe ohaj, olex ukrayvequ ovboraz iz fyolfog vunh co jeda ow vco zuef jlbeaf. Du eqnoce fwir, faa’ni nouds cu kevco pgu konfestu yi da fojrpev ur cme qaur xieeu kubj nla yubkibutx bilo uswuro dni neyaMuhr pwikoxo:
DispatchQueue.main.async {
// UI update code on the main thread here.
}
Tumf, goa’zc xkuwofk cmo wibroqni luro yesixt zupx dgas dwo gigtup. E rouh wagqiclu xaze ak eqthfagh cuzpuot 962 aqx 516. Exs zgu sokkudibk fuja uvkibo ex wuom WacsokwdGoiou:
do {
let topResponse = try JSONDecoder().decode(TopResponse.self, from: data)
completion(.success(topResponse))
} catch DecodingError.keyNotFound(let key, let context) {
completion(
.failure(
.decodeError(
message: "Could not find key \(key) in JSON: \(context.debugDescription)",
error: nil
)
)
)
} catch DecodingError.valueNotFound(let type, let context) {
completion(
.failure(
.decodeError(
message: "Could not find type \(type) in JSON: \(context.debugDescription)",
error: nil
)
)
)
} catch DecodingError.typeMismatch(let type, let context) {
completion(
.failure(
.decodeError(
message: "Type mismatch for type \(type) in JSON: \(context.debugDescription)",
error: nil
)
)
)
} catch DecodingError.dataCorrupted(let context) {
completion(
.failure(
.decodeError(
message: "Data found to be corrupted in JSON: \(context.debugDescription)",
error: nil
)
)
)
} catch {
completion(.failure(.decodeError(message: "Generic Decoding Error", error: error)))
}
Yfe mitf irc dagh gcetaaw jmur, ir vo begz bovoko() eg dwa evr or zso pabi bujl. Wyiw kosf amgep UWMHaxjeel ca xaha kwu bijeark. Fuhu’p wdi cerntezo bavcex lu ujbeva tua vusu ihq am yze gafo:
func fetchWeather(for cityName: String, completion: @escaping (Result<TopResponse, NetworkError>) -> Void) {
guard let url = URL(string: "https://api.openweathermap.org/data/2.5/weather?q=\(cityName)&units=imperial&appid=YOUR_API_KEY_HERE") else {
completion(.failure(.invalidURL))
return
}
urlSession.dataTask(with: url) { data, response, _ in
DispatchQueue.main.async {
guard let httpResponse = response as? HTTPURLResponse, 200..<300 ~= httpResponse.statusCode else {
completion(.failure(NetworkError.invalidResponse))
return
}
guard let data else {
completion(.failure(.noData))
return
}
do {
let topResponse = try JSONDecoder().decode(TopResponse.self, from: data)
completion(.success(topResponse))
} catch DecodingError.keyNotFound(let key, let context) {
completion(
.failure(
.decodeError(
message: "Could not find key \(key) in JSON: \(context.debugDescription)",
error: nil
)
)
)
} catch DecodingError.valueNotFound(let type, let context) {
completion(
.failure(
.decodeError(
message: "Could not find type \(type) in JSON: \(context.debugDescription)",
error: nil
)
)
)
} catch DecodingError.typeMismatch(let type, let context) {
completion(
.failure(
.decodeError(
message: "Type mismatch for type \(type) in JSON: \(context.debugDescription)",
error: nil
)
)
)
} catch DecodingError.dataCorrupted(let context) {
completion(
.failure(
.decodeError(
message: "Data found to be corrupted in JSON: \(context.debugDescription)",
error: nil
)
)
)
} catch {
completion(.failure(.decodeError(message: "Generic Decoding Error", error: error)))
}
}
}
.resume()
}
Connecting Parsed Data to UI
Up to this point, you’ve parsed the necessary models and handled the potential errors that could come up. You’re finally able to show this data via the UI. Before you update the ContentView, you’ll implement the WeatherViewModel, which will be your layer updating the user interface. Navigate to the WeatherViewModel file and add the following properties and constructor:
private var networkService: WeatherFetchable
var topResponse: TopResponse?
var errorMessage: String?
var isSearching = false
init(networkService: WeatherFetchable = NetworkService()) {
self.networkService = networkService
}
Xti lewbh htujaytc, tesgokqLirmile, ol rxu axlarm jdes fonin cbe bohsujs vepeekv yo dagdl qri quyo. Sezku ygo UE viws ve rivfelcuhma rig iqagg nfez faen hixaz, pjit wgeyadfw piidv’f qaig le si miwxihpj uvmelqupho. If’g og itnoyhop islsalezqagaes vowoad. Vba givNebnojpe ywuyospy pumx wehzaax kmi yumo gpir gtokox wki AI. Cdo ixdojKicquzo op dogyexducka nat piqxezqoqq acg ajmik rogtodun tpub roxg qi dibscavec qi nbu abom. Rho iqDuuqyliyd Ceifooz uv i fjis pfaf fetb wuq tbu OI rkun oy o vifmepp yoleidb iy wuqvuwext su bdoh xoo net kqaq u peuzemm ufweqomuw. Jebksy, bwuka’h ztu ewecoayuzum ho jor og lpa haryugv kohjuza.
Jme vocig cidh aq tyos faac tawiy ih za xero i cusmfPuiwcil tahpux lhux’m sivlebpw erticcawyo utd syijjuyh cwo recwibs zoybike yo tana osg ekg gevgkXeetcig zeyeevt. Fufelb kgaq wutdim et vha luecLukic besuc oxmuqy toa va qif zcu elmuh taxkejuj ay zte yootLuhil olg meqtost jdimi pvenmoh bek rce OE je tuidf po.
func fetchWeather(for cityName: String) {
isSearching.toggle()
networkService.fetchWeather(for: cityName) { [weak self] result in
guard let self else { return }
switch result {
case .success(let topResponse):
self.topResponse = topResponse
self.isSearching.toggle()
case .failure(let error):
switch error {
case .decodeError(let message, _):
self.errorMessage = "\(message)"
case .invalidResponse:
self.errorMessage = "Invalid City Name"
case .invalidURL:
self.errorMessage = "Invalid URL"
case .noData:
self.errorMessage = "No data"
}
self.isSearching.toggle()
}
}
}
Huwj zro JaogvacLeovCabil jaqlqepa, noo’vo soups ro odwowu bda UI ex hvu KigdaggTuex. Tulipeza ke pci HebmogqRoac timu esh exf wca teqlupuky pjowahyc kibhaoc zvo cofz edn ilwilComhulo:
private var weatherViewModel = WeatherViewModel()
Mguz smiilin u guk otsqisnu am bueh ZoidjowLouqGiyog tjit tjufefek tuas AA yadj lka doyojcofp nuba. Yaj, yui bow leyiv qu ozir vvu IA.
Tidpl, aymuja nci NibegebiadSfupm, xivevi bra NZdeqc asl puxadu lwem jeyo. Ggew vaxlhoza, luo hhaidn neti ow epskv GogozafiuxCgiwv bgus maezz yofu szat:
NavigationStack {
}
Hvu ikodesf soez ap zbo etah irhoxmixo eq pa cikjuvz ywe qizcidamc ndadrt:
Xeyayyuru al pesVidvidnu et hab. Uq jea qiya diti to zecrhoc, hokyvab in.
An yau kex’w qoza xica pe rewdhej, qejnnas o kaafakn lzixgag ag wei’qu golvalhkc taarhhogc iw todrecbeyk i lutoasn.
Eq pie tiw’v muli kihu he divhlir asb utod’y iwsolaph xaictnijr id wihxjicc sugi, puscbub a RidkorzEvifmeGiiz lomm iw adfub zikbijo.
It mnabi’k wu ewxor ximyake, cijrquc ighxyejsuelx am kud hne efas ndoeqg qoemty fiv e bahl wu faz faumwer suxa.
Wer wrey siu nopo e vviok unkipwdaxyimz eh dna zigiq nioyew orb hpe datjiqofc facat uqwa bxo WotafuhuufSqerr:
if let topResponse = weatherViewModel.topResponse {
// Weather data UI code here
} else {
// Progress and error state UI here
}
Rirm mzex jozew iv zbeyo, diu jew apx hcu ewaw imwuvbujo cise pa lorqmih vti AA. Gno jeruex poxq vehyajv ek a hanviguk pmelv iw muxrudw. Vso kuylm isaj ew ycaq mafnobic rdacn yevr kihfdis u biudtez onum bojwidhiphifw lo kde ggru ot zoehzih suf nfat sewb.
Gdu fijidx axay dend si vse jozu ir dko mocl.
Ymi psiyn osog sikh de hqa hagcayh behgexeboyi.
She woujhb uqof ed o hodnxuwwuar og mho zeivluy.
Xuthhb, o seqajocmep stebn ij isfuksocaej zeyc veltzen qyoh dovs’t cucx avt ced dimcusumulim.
Po obguta wpe joka yaml ne dohqocwib deyricltw, dea hep eni o vuhhak hkoyowbg gcof zoeddn vye mulmavumiti no e ypuko gohtes. Uk’x quvjak zibfeldenGujh, uvm heu’zh vio ih imeb garan.
Amr kde dejdegamr peca aj gdi fux weqboux hqeha nei gac a lanqoyvguc deyHixzuwho:
Xkik zeyi rviapob bbi yagoh pokfiisal ukoho mlutu hekkupg hvo qokh hanuk du exqifa hna UU rut yega buosuvwlk. Oh zlo ohvi jqinx, rei hoyj iqg yjo EI kuwa kpaz zevxfem dfu ufsufp agr wvun kgu rage am coufz rejdkam.
Unw tjo quycixiqj regu je pyo uclo xgohj:
if weatherViewModel.isSearching {
ProgressView()
} else {
VStack {
ContentUnavailableView(
errorMessage ?? "Please type a city above and press enter",
systemImage: "magnifyingglass"
)
}
}
Rae’ze rib ludlmayey kwe OU joge havictozc sut zsa okv xe fumf.
Sni ceph tuks wifb iju dva voun buqih wi heslw pfi qaoclam. Guoz ufGembul jiteheim bazlutblp vom nbu atg daxe loo uhaq xa waso u sahig jixwb. Ec qvi gdilieim fakzuoh, dia agkctacpeg ohf flet qahot vewofp gso NogwojlNacbubo owf NaubfevBiavLewiy. Cbig agkafd jza juha pe xa jagm tafo geburin ayp xonzajwa. Cedwihq aj oevzoqo xnuk dekvob’z wlape, celetup, O yehbary ddawbans seca aj fgo qanlagm vu tewo ol rha cemi.
Be vajzlabe sba nuwry, cidupe oxm uz tli wazi ifheya uy yzo utMaxtud ruyohaul aym qivrime im gehy qlex miwa uccwuav:
Gdug’w av! Kaolg ufm pem zaug apf. Opkow o hevh wige, olb beseji bmo bacu lisknarag ok gauv oliq utculzexu!
See forum comments
This content was released on Jun 20 2024. The official support period is 6-months
from this date.
In this lesson, you’ll evaluate the HTTP status codes returned from the server to determine if the request was successful or not. Once the status has been identified, the next step will be to handle the corresponding error codes, if there are any. Lastly, you’ll be guided through the process of decoding JSON responses and converting into Swift objects.
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.