„Covable vs ObjectMapper“

Nuotrauka https://unsplash.com/photos/_rNVw54xZZg

Neseniai eksperimentavau su nauju „Swift“ protokolu „Covable“, kaip būdu susieti JSON, gautą iš nuotolinės paslaugos, į „Swift“ modelio objektą.

Šiek tiek fono, „Swift 4“ buvo pridėtas „Covable“ kaip būdas švariai leisti objektams paversti save išoriniu vaizdu ir iš jo. Pats užkoduojamas yra tik tipinis dekoduojamo ir užkoduojamo tipo pavyzdys.

Šiam įrašui aš daugiausiai dėmesio skirsiu iš dekoduojamos dalies, nes tai bus susidomėjimas iš nuotolinio JSON atvaizdo, kuris mane domina.

Palyginimas

Anksčiau plačiai naudojau „ObjectMapper“, tačiau kadangi „Covable“ yra integruota į „Swift“, norėjau palyginti juos abu. Funkcijos, kurias noriu palyginti:

  • Patvirtinimas ️
  • Individualizuotos transformacijos (žemėlapių sudarymas į pasirinktinius tipus, pvz., JSON eilutės atvaizdavimas į regex)
  • Klaida tvarkant

Duomenys, kuriuos aš analizuoju, yra tikrosios konfigūracijos, kurią nuotoliniu būdu gauname „BBC Sport“ programai

Tai gana paprasta JSON struktūra, tačiau joje yra keletas įprastų išraiškų, nes norėčiau būti priskirta NSR RegularExpression, o ne eilutei.

„ObjectMapper“

Šiam JSON modeliui susieti su „ObjectMapper“ reikalingos struktūros:

Visi atvaizdai atitinka „ImmvableMappable“ protokolą, tai reiškia, kad jiems reikia konstruktoriaus, kuris paima Žemėlapio objektą ir išmeta klaidą, jei atvaizdavimas nepavyksta.

Patvirtinimas

Norėdami atlikti patvirtinimą, galite naudoti pasirenkamuosius elementus. Šiame pavyzdyje nusprendėme, kad programa gali veikti be šių el. Pašto adresų, taigi el. Pašto adresai yra pasirenkami. map.values ​​(„el. laiškai“) pateikiama klaida, jei jų rakto nėra arba jo negalima perduoti tinkamo tipo. Mes pasinaudojame bandymu? užfiksuoti tą klaidą ir, patekus į klaidą, ją tiesiog paversti nuline verte.

Jei nuspręsime, kad reikalinga tam tikra nuosavybė, nepažymime jos kaip neprivalomos ir leiskite klaidai plisti.

Apskritai, naudojant „ImmvableMappable“, patvirtinimas vyksta labai greitai

Galbūt pastebėjote, kad į šį skambučio „map.value“ yra įtrauktas papildomas argumentas („regex“, naudojant: RegexTransformer ()) Tai yra pritaikyta transformacija paversti eilutę „NSR RegularExpression“, kuri gražiai nukreipia mane į kitą mano tašką!

Individualizuotos transformacijos

„ObjectMapper“ palaiko pasirinktinius pertvarkymus iš dėžutės, ir tai labai paprasta.

Čia tiesiog įgyvendiname „TransformType“ protokolą ir su juo susijusį „transforFromJSON“ metodą. Tai priima tipą, kurį mes atiduodame į styginį ir tada saugiai išbandome? konvertuoti eilutę į NSRegularExpression.

Tada šį transformatorių galima pakartotinai naudoti bet kur

Klaida tvarkant

Norėdami išbandyti klaidų tvarkymą, naudosiu JSON failą su trūkstamu išvesties raktu.

Vykdydami tai per „ObjectMapper“, gauname gražų naudingą klaidos pranešimą.

Kartojant įvyko klaida.
- priežastis: negalima perduoti į „Styginių“
- vieta: Config.init (žemėlapis :): 30
- raktas: išėjimas
- currentValue: nulis

Tai pasako viską, ko reikia, kad greitai rastume problemą. Radau naudodamas „AlamofireObjectMapper“ integraciją klaidų, kurios yra mažesnės nei ideali, atžvilgiu.

Koduojamas

Neįmanoma, kad ekvivalentiškas „Codable“ įgyvendinimas yra toks

Jis labai panašus į „ObjectMapper“, nors klavišai yra apibrėžti kaip enumai, naudojant „CodingKey“ protokolą.

Yra tikrai maloni funkcija, naudojant „Covable“, nes pradinis iniciatorius gali būti sukurtas jums, jei jie nurodo, kad atvejai yra lygūs ypatybei, o tipas, kurį mes atvaizduojame, yra pats Dekoduojamasis. To pavyzdys yra „CodableConfig“ aukščiau. Kadangi visos jos savybės yra dekoratyvios, mums nereikia rašyti iniciatoriaus!

Patvirtinimas

Tai veikia lygiai taip pat kaip „ObjectMapper“

Iniciatorius pateikia klaidą, jei yra klaidų žemėlapis, kurį galima pašalinti skambučių svetainėje. Vėlgi, naudokitės parinktimis čia, kad nuspręstumėte, kaip geriausiai tvarkyti klaidas.

Individualizuotos transformacijos

Jūs pastebėsite aukščiau pateiktame kode. Viskas bus šiek tiek mažiau aiški, kai bandome susieti mūsų NSRegularExpression tipą. Staiga turime įdiegti iniciatorių init (iš dekoderio: dekoderio) ir atsisiųsti „KeyedDecodingContainer“ iš dekoderio.

Apie tai jau yra daug rašoma, jei norėtumėte daugiau informacijos, kurios aš čia neketinu aptarti.

Kodas tampa gana išsamus dabar rašyti, ir mes kartojame transformacijos kodą. Šiuo atveju tai tik papildoma eilutė, tačiau dažnai noriu parašyti sudėtingesnes transformacijas, kurias norėčiau išskirti taip, kaip galiu naudodamas „ObjectMapper“.

Taigi aš padariau nedidelę biblioteką, kad galėčiau pridėti pritaikytų transformacijų palaikymą - ją galite rasti naudodamiesi „CocoaPods“, arba galite tiesiog nukopijuoti šaltinį, nes tai tik keli failai.

Galbūt norėsite pridėti plėtinį prie tokio tipo, kuris jums nepriklauso, tačiau yra geras paaiškinimas, kodėl „Swift Evolution“ tai neįmanoma.

Naudodamiesi „CodableExtensions“ biblioteka, dabar galime supaprastinti savo kodą, kad jis atrodytų labai panašus į „ObjectMapper“

„RegexCodableTransformer“ taip pat labai panašus į tai, ką anksčiau turėjome su „ObjectMapper“

Biblioteka taip pat supaprastina sąsają su container.decode (), taigi tipo nebereikia perduoti, kaip jis buvo numanomas.

Klaida tvarkant

Aš naudoju tą patį JSON failą, kaip lyginti klaidas, kaip anksčiau. Klaida atrodo

„keyNotFound“ („config_spike“ ").", pagrindinė klaida: nulis))

Klaida nėra tokia graži , tačiau ji turi viską, kad būtų galima išspręsti problemą.

Išvada

Tarp dviejų požiūrių yra kur kas daugiau panašumų nei skirtumų. Jei transformacijos yra svarbios, tada „ObjectMapper“ neveikia. Tačiau vienas iš pagrindinių perėjimo motyvų yra pereiti prie standarto, kurį „Apple“ sukūrė, neprisinešdami kitos bibliotekos.

Jei transformacijos yra svarbios, pridėję keletą protokolų, tą patį elgesį galite pasiekti naudodamiesi „Codable“

Mes nusprendėme pereiti į „Codable“ dabar, kad galėtumėte naudotis visomis naujomis funkcijomis. Esu tikra, kad yra funkcijų, kurių praleidau iš šio sąrašo, tačiau išsirinkau mums svarbiausias.