Kodanleg vs ObjectMapper

Mynd af https://unsplash.com/photos/_rNVw54xZZg

Ég hef nýlega verið að gera tilraunir með nýja Codable samskiptareglur Swift sem leið til að kortleggja JSON sem sótt var af ytri þjónustu í Swift líkan mótmæla.

Fyrir smá bakgrunn var Codable bætt við í Swift 4 sem leið til að leyfa hlutum hreint að umbreyta sér í og ​​úr ytri framsetning. Codable sjálft er bara tegundir af afskráanlegri og umbreytanlegri.

Fyrir þessa færslu ætla ég að einbeita mér að dekóða hlutanum, þar sem það er umbreytingin frá ytri JSON framsetning sem ég hef áhuga á.

Samanburður

Ég hef notað ObjectMapper mikið áður fyrr en þar sem Codable er nú innbyggt í Swift vildi ég gera samanburð á þessu tvennu. Eiginleikarnir sem ég vil bera saman eru:

  • Staðfesting ️
  • Sérsniðin umbreyting (kortlagning í sérsniðnar gerðir, t.d. kortlagning á JSON streng í regex)
  • Villa við meðhöndlun

Gögnin sem ég ætla að flokka eru raunveruleg stilling sem við sækjum lítillega fyrir BBC Sport appið

Þetta er nokkuð einfalt JSON uppbygging en það er með nokkur regluleg orðatiltæki að því leyti að mig langar að kortleggja NSRegularExpression, ekki streng

ObjectMapper

Skipulagið sem þarf til að kortleggja þetta JSON líkan með ObjectMapper eru eftirfarandi.

Stöðvarnir eru allir í samræmi við ImmutableMappable samskiptareglur, sem þýðir að þeir þurfa smíðaaðila sem tekur Map mótmæla og kastar villu ef kortlagningin mistekst.

Staðfesting

Til að framkvæma staðfestingu er hægt að nota Optionals. Í þessu dæmi höfum við ákveðið að forritið geti virkað án þessara netfæra svo tölvupósturinn er valfrjáls. map.values ​​(„tölvupóstur“) kastar villu ef þeir eru ekki til staðar eða ekki er hægt að varpa þeim á réttan hátt. Við notum reynið? til að fanga þá villu og bara breyta henni í núll gildi ef það er villa.

Ef við ákveðum að tiltekin eign sé krafist, merkjum við hana ekki sem valfrjálsa og leyfum að villan breiðist út.

Á heildina litið er löggildingin mjög beinn með því að nota ImmutableMappable

Þú gætir hafa tekið eftir því að fleiri rök hafa borist inn á þetta símakort. Gildi („regex“ með því að nota: RegexTransformer ()) Það er fyrir sérsniðna umbreytingu til að breyta strengnum í NSRegularEpression sem leiðir mitt fallega á næsta stig!

Sérsniðin umbreyting

ObjectMapper styður sérsniðnar umbreytingar úr kassanum og það er mjög beint áfram.

Hér erum við bara að innleiða TransformType siðareglur og tilheyrandi transformFromJSON aðferð. Það tekur inn gerð sem við köstum í streng og reynum svo örugglega? til að breyta strengnum í NSRegularExpression.

Þessi spennir er síðan til staðar til að endurnýta hvar sem er

Villa við meðhöndlun

Til að prófa villuhöndlunina mun ég nota JSON skrá með úttakstakkann sem vantar.

Þegar þú keyrir þetta í gegnum ObjectMapper fáum við falleg gagnleg villuboð.

Mistók villa við kortlagningu.
- ástæða: Get ekki sent út í 'streng'
- staðsetning: Config.init (kort :): 30
- lykill: framleiðsla
- núverandi Gildi: núll

Það segir okkur allt sem við þurfum til að finna fljótt hvar málið er. Ég hef komist að því þegar AlamofireObjectMapper samþættingin er notuð til að bæla villurnar sem er minna en tilvalið.

Kóðanleg

Úr kassanum er samsvarandi framkvæmd kóða sem hér segir

Það er mjög svipað og ObjectMapper þó að takkarnir séu skilgreindir sem enums með CodingKey siðareglunum.

Það er mjög flottur eiginleiki að nota Codable að því leyti að hægt er að búa til upphafsstaf fyrir þig ef þeir eru að málum eru jafnir eigninni og gerðin sem við erum að kortleggja er sjálf Afkóðanleg Dæmi um það er CodableConfig hér að ofan. Þar sem allir eiginleikar þess eru sjálfir afkóðanlegir þurfum við ekki að skrifa frumstillingu!

Staðfesting

Þetta virkar nákvæmlega eins og ObjectMapper

Ræsirinn kastar villu ef villa er á kortlagningu sem hægt er að meðhöndla á hringitorginu. Aftur, nýttu Optionals hér vel til að ákveða hvernig best sé að höndla villur.

Sérsniðin umbreyting

Þú munt taka eftir ofangreindum kóða, það verður allt minna skýrt þegar við erum að reyna að kortleggja NSRegularExpression tegundina okkar. Við verðum skyndilega að innleiða upphafsstýringartækið (frá myndlykil: myndlykill) og fá okkur KeyedDecodingContainer úr myndlyklinum

Það er mikil skrif um þetta nú þegar ef þú vilt fá nánari upplýsingar, sem ég ætla ekki að fara yfir hér.

Kóðinn verður orðréttur að skrifa núna og við erum að endurtaka umbreytingarkóðann. Þetta er aðeins auka lína í þessu tilfelli en það eru oft skipti sem ég vil skrifa flóknari umbreytingar sem ég vil einangra eins og ég get með ObjectMapper

Svo ég bjó til lítið bókasafn til að bæta við stuðningi við sérsniðnar umbreytingar þetta er fáanlegt í gegnum CocoaPods, eða þú gætir bara afritað heimildina þar sem þetta eru bara nokkrar skrár.

Þú gætir hugsað þér að bæta við viðbót við gerðina sem þú átt ekki en það er góð skýring á því hvers vegna þetta er ekki mögulegt á Swift Evolution.

Með því að nota CodableExtensions bókasafnið getum við nú einfaldað kóðann okkar til að líta mjög út eins og ObjectMapper

Og RegexCodableTransformer er líka mjög líkur því sem við höfum áður haft með ObjectMapper

Bókasafnið einfaldar einnig viðmótið að container.decode () þannig að ekki þarf lengur að færa tegundina inn eins og ályktað er.

Villa við meðhöndlun

Ég er að nota sömu JSON skrá til að bera saman skekkju og áður. Villan lítur út

keyNotFound (config_spike.CodableRewriter. (CodingKeys í _4D474241C6D85B5C48988D77CA644850) .output, Swift.DecodingError.Context (codeingPath: [config_spike.CodableConfig. ").", underError: nil))

Villan er ekki eins falleg og everything en það hefur allt til að kemba málið.

Niðurstaða

Það eru miklu fleiri líkindi en munur á þessum tveimur aðferðum. Ef umbreytingar eru mikilvægar þá virkar ObjectMapper úr kassanum. Hins vegar er einn helsti hvatinn að því að skipta yfir í staðalinn sem Apple hefur búið til án þess að þurfa að koma á annað bókasafn.

Ef umbreytingar eru mikilvægar, með því að bæta við nokkrum samskiptareglum, geturðu fengið sömu hegðun með Codable

Við höfum ákveðið að fara í Codable núna fyrir alla nýja eiginleika okkar. Ég er viss um að það er eiginleikar sem ég hef misst af þessum lista en ég valdi þær mikilvægustu fyrir okkur.