Objectmapper: Como colocar condições no método de mapeamento?

Criado em 5 out. 2016  ·  4Comentários  ·  Fonte: tristanhimmelman/ObjectMapper

Tento implementar uma estrutura StreetAddress da API local do Google Map, mas não sei como é possível ser flexível no método de mapeamento, não vi nada relacionado a isso na documentação atual.

Por exemplo, em minha estrutura, tenho um número de rua e uma propriedade de rota.
Aqui está um exemplo de resposta JSON da API do Google:

"address_components": [
{
"long_name": " 36 ",
"short_name": "36",
"tipos": [
"número da rua"
]
},
{
"long_name": " Rue de Dunkerque ",
"short_name": "Rue de Dunkerque",
"tipos": [
"rota"
]
},

Não vi uma maneira de ter condições de guarda, algo assim:

guarda deixar componentes = mapear ["result.address_components"] como? [[String: Qualquer]] else {
Retorna
}
// de outros...

Então eu poderia encontrar uma maneira de recuperar manualmente essas informações, mas é claro, este início de código de amostra não funciona.

É necessária uma transformação para isso ou existe outra maneira?

Comentários muito úteis

Ok foi o que pensei, obrigado por essa solução limpa cara, muito útil!

Todos 4 comentários

Não tenho certeza do que você pretende fazer. Se você gostaria de ...

  1. Faça o inicializador falhar quando não houver result.address_components no JSON.

=> Consulte https://github.com/Hearst-DD/ObjectMapper#init_ -map-map

  1. Use o valor padrão quando não houver result.address_components no JSON.

=> Talvez você precise usar Transform . Veja minha resposta em pergunta semelhante: # 606

Não, de fato result.address_components contém uma matriz onde desejo recuperar valores diferentes. Desculpe, o exemplo JSON está formatado incorretamente na minha primeira postagem.

Tenho essas duas propriedades do lado do cliente:

var route: String?
var streetNumber: String?

Esses dois valores estão presentes no array address_components e dependem da propriedade "type" de cada objeto deste array. Então, eu preciso de condições para mapeá-los para propriedades correspondentes

a rota deve ser mapeada com o valor: Rue de Dunkerque & streetNumber deve ser igual a 36

Ah, entendi. Nesse caso, você deve usar seu próprio Transform . Eu faria assim:

struct AddressComponent {
  var route: String?
  var streetNumber: String?
}

let addressComponentRouteTransform = TransformOf<[[String: Any]], AddressComponent>(
  // Input:
  //     [
  //       {
  //         "long_name": "36",
  //         "short_name": "36",
  //         "types": [
  //           "street_number"
  //         ]
  //       },
  //       {
  //         "long_name": "Rue de Dunkerque",
  //         "short_name": "Rue de Dunkerque",
  //         "types": [
  //           "route"
  //         ]
  //       }
  //     ]
  //
  // Output:
  //     AddressComponent(route: "36", streetName: "Rue de Dunkerque")
  fromJSON: { (componentDicts: [[String: Any]]?) -> AddressComponent?
    let route = componentDicts?.lazy
      .filter {
        guard let types = $0["types"] as? [String] else { return false }
        return types.contains("route")
      }
      .flatMap {
        $0["long_name"] as? String
      }
    let streetNumber = componentDicts?.lazy
      .filter {
        guard let types = $0["types"] as? [String] else { return false }
        return types.contains("street_number")
      }
      .flatMap {
        $0["long_name"] as? String
      }
  },

  // Input:
  //     AddressComponent(route: "36", streetName: "Rue de Dunkerque")
  //
  // Output:
  //     [
  //       {
  //         "long_name": "36",
  //         "short_name": "36",
  //         "types": [
  //           "street_number"
  //         ]
  //       },
  //       {
  //         "long_name": "Rue de Dunkerque",
  //         "short_name": "Rue de Dunkerque",
  //         "types": [
  //           "route"
  //         ]
  //       }
  //     ]
  toJSON: { (component: AddressComponent?) -> [[String: Any]]?
    var componentDicts: [[String: Any]] = []
    if let route = component?.route {
      componentDicts.append([
        "long_name": route,
        "short_name": route,
        "types": [
          "route",
        ],
      ])
    }
    if let streetNumber = component?.streetNumber {
      componentDicts.append([
        "long_name": streetNumber,
        "short_name": streetNumber,
        "types": [
          "street_number",
        ],
      ])
    }
    return componentDicts
  }
)

struct Venue {
  var address: AddressComponent

  mutating func mapping(map: Map) {
    self.address <- (map["address_components"], addressComponentRouteTransform)
  }
}
Dica: Use 3 crases (`) para fazer um bloco de código no markdown.

func doSomething() {
}
func doSomething() {
}
Ou você pode usar `
`tag se você quiser fazer um texto em negrito em algum lugar.

<pre>
func <strong>doSomething</strong>() {
}
</pre>
 função doSomething () {
 }

Ok foi o que pensei, obrigado por essa solução limpa cara, muito útil!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

liltimtim picture liltimtim  ·  3Comentários

delbyze picture delbyze  ·  3Comentários

AashishSapkota picture AashishSapkota  ·  3Comentários

danyalaytekin picture danyalaytekin  ·  4Comentários

nearspears picture nearspears  ·  4Comentários