Mappable este un cadru usor, flexibil, usor de utilizat pentru a converti JSON in model, optimizat special pentru initializarea proprietatilor imuabile.

Struct Flight: Mappable {let number: String let time: Date init (map: Mapper) throws {// cu ajutorul @dynamicMemberLookup number feature = try map.id () time = try map.time () // or use vechiul mod // numar = incercati map.from (“id”) // timp = incercati map.from (“timp”)}} // Zbor (JSONString: json)

De asemenea, este furnizat un plugin xcode pentru a genera automat implementarea.

Caracteristici

  • JSON sa obiecteze doar prin specificarea relatiilor de mapare
  • Optimizat pentru imuabil si optional
  • Flexibil: usor de amestecat cu initailizare manuala
  • Conversie tipuri compatibile: de ex., O proprietate Int ar putea fi initializata cu valoarea String
  • Suport cale cheie

De ce altul?

Majoritatea bibliotecilor JSON pentru a modela nu pot gestiona bine initializarea proprietatilor imuabile. Acestea necesita declararea proprietatilor cu tipuri var si nullable, care rup sprintul lui Swift si duc la un cod gresit. Mappable s-a nascut pentru rezolvarea acestei probleme.

Pro Contra Codabil – Nativ in Swift

– Automat (fara relatii de mapare)

– accepta conversia in 2 directii – Inflexibil

– Nu accepta clasa inerenta HandyJSON – Automata (nu exista relatii de mapare)

– Conversie in 2 directii Nu exista proprietati imuabile care accepta ObjectMapper in 2 directii conversie – Suportul proprietatilor imuabile este slab *

– Partile multiple au dus la haos

– Lipseste suportul pentru unele combinatii de tipuri. SwiftyJSON Nu este un convertor de obiecte JSON.

Este doar un instrument convenabil pentru a trata datele JSON.

* 1) Nu se poate manipula optional in mod convenabil. 2) Nu accepta conversia de tipuri compatibile, care se incadreaza in intregul obiect pentru fiecare format mal-mic in JSON.

Mappable este foarte inspirat de ObjectMapper. Ati putea calca Mappable ca o versiune imbunatatita a ImmutableMappable in ObjectMapper.

Utilizare

Cele elementare

Pentru a sprijini maparea, un tip ar trebui sa implementeze protocolul Mappable, care are doar o metoda de initializare:

clasa Tara: Mappable {let nume: String let orase: [Oras] // struct Oras: Mappable {…} let atContinent: Continent // enum Continent: Mappable {…} init necesar (harta: Mapper) arunca { name = try map.from (“name”) cities = try map.from (“city”) atContinent = try map.from (“location.continent”)}}

Trebuie doar sa scrieti relatia de mapare: o cale cheie pentru o proprietate. Desi aceste linii sunt doar instructiuni de atribuire normale, tipurile nu sunt necesare pentru a fi specificate, astfel incat ati putea urma aceste linii ca o reprezentare speciala a relatiilor de mapare. (Ati putea citi randul ca „incercati (sa) hartati (valoarea) din XXX” ????)

Apoi, puteti initializa un obiect ca acesta:

// NOTA: aceste initializari arunca erori, ar trebui sa faceti erori de gestionare let c = try Country (JSON: jsonDict) let d = try? Tara (JSONString: jsonString)

Tipuri acceptate

Valoare implicita

// folositi doar „??` orase = incercati map.from („oras”) ?? []

Manevrare optionala

Tipurile optionale nu vor genera o eroare, chiar daca nu exista o data corespunzatoare in JSON sau data este in format gresit. In aceasta situatie se va atribui un zero.

Daca declarati o proprietate ca optionala, aceasta poate insemna ca aceste date nu sunt strict necesare in JSON. Deci, doriti sa obtineti o valoare nula daca nu exista date de fapt.

struct Utilizator: Mappable {let ID: String let summary: String? init (map: Mapper) arunca {ID = incercati map.from (“id”) summary = incercati map.from (“summary”)}} let json = [“id”: “a123”] let user = try! Utilizator (JSONObject: json) // Nu se va bloca.

Conversie tipuri compatibile

Convertiti din Int, Double, Float, CGFloat String Bool Int, “true”, “True”, “TRUE”, “YES”, “false”, “False”, “FALSE”, “NO”, “0”, ” 1 “String Int, NSNumber URL String Date Double (secondsSince1970), String (RFC 3339, eg 2016-06-13T16: 00: 00 + 00: 00)

Mai multe detalii aici.

Conversie personalizata

Continutul din initializator este doar o atribuire simpla, deci puteti face orice cu datele. Utilizati map.getRootValue () si map.getValue (keyPath 🙂 pentru a obtine valoarea bruta JSON si faceti ceea ce doriti.

Pentru o conversie convenabila a datei, exista si o proprietate de optiuni in Mapper pentru a seta strategia de data personalizata. (Exemplu mai complex aici)

Enum

Enumere conforme RawRepresentable au o implementare implicita a Mappable. Trebuie doar sa declarati conformarea Mappable cu tipurile dvs. de enumere, apoi va functiona.

Pentru enum cu valorile asociate, puteti efectua implementarea manuala:

enum EnumWithValues: Mappable {case a (Int) case b (String) init (map: Mapper) throws {// Poate fi initializat cu o data json ca: // {“type”: “a”, valoare: 123} let value = try map.getValue (“type”, as: String.self) switch value {case “a”: self = .a (try map.from (“value”)) case “b”: self = .b (incercati map.from (“valoare”)) implicit: aruncati ErrorType.JSONStructureNotMatchDesired (valoare, “sir a / b”)}}}

Mostenirea clasei

clasa ChildModel: BaseModel {let b: Int necesar init (harta: Mapper) arunca {b = incercati map.from (“b”) incercati super.init (harta: harta)}}

Calea cheii imbricate

Utilizati calea cheii „AAA.BBB” pentru a mapa o valoare a caii pe mai multe niveluri in JSON:

// let json = “” “{” AAA “: {” BBB “: 1}}” “” b = try map.from (“AAA.BBB”) // folositi `n` pentru a obtine o a n-a valoare in tablou // let json = “” “{” AAA “: [11,22,33]}” “” b = try map.from (“AAA.`2`”) // b = 33

Daca o cheie normala contine. in mod natural, ati putea folosi ca map.from („a.file”, keyPathIsNested: false), pentru a trata cheia ca pe o cale de un singur nivel.

Instalare

  • pentru Swift 5 si 4.2: v1.3 +
  • pentru Swift 4.1 si mai jos: v1.2.2

Cocoapode

Manager de pachete Swift

.Pachet (url: “https://github.com/leavez/Mappable.git”, de la: “1.5.0”),

Cartagina

Licenta

Mappable este disponibil sub licenta MIT. Consultati fisierul LICENTA pentru mai multe informatii.