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?
Não tenho certeza do que você pretende fazer. Se você gostaria de ...
result.address_components
no JSON.=> Consulte https://github.com/Hearst-DD/ObjectMapper#init_ -map-map
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!
Comentários muito úteis
Ok foi o que pensei, obrigado por essa solução limpa cara, muito útil!