Я пытаюсь реализовать структуру StreetAddress из Google Map Place API, но не знаю, как можно гибко использовать метод сопоставления, я не видел ничего связанного с этим в текущей документации.
Например, в моей структуре у меня есть номер улицы и свойство маршрута.
Вот образец ответа JSON от Google API:
"address_components": [
{
"long_name": " 36 ",
"short_name": "36",
"типы": [
"номер улицы"
]
},
{
"long_name": " Rue de Dunkerque ",
"short_name": "Rue de Dunkerque",
"типы": [
"маршрут"
]
},
Я не видел способа установить условия охраны, примерно так:
guard let components = map ["result.address_components"] как? [[String: Any]] else {
возвращение
}
// Другие...
Тогда я мог бы найти способ вручную получить эту информацию, но, конечно, это начало примера кода не работает.
Нужна ли для этого трансформация или есть другой способ?
Я не уверен, что вы собираетесь делать. Если хочешь ...
result.address_components
.=> См. Https://github.com/Hearst-DD/ObjectMapper#init_ -map-map
result.address_components
.=> Возможно, вам потребуется использовать Transform
. Смотрите мой ответ в аналогичном вопросе: # 606
На самом деле нет result.address_components содержит массив, в котором я хочу получить разные значения. Извините, образец JSON в моем первом посте неправильно отформатирован.
У меня есть эти два свойства на стороне клиента:
var route: String?
var streetNumber: String?
Эти два значения представлены в массиве address_components и зависят от свойства «тип» в каждом объекте этого массива. Поэтому мне нужны условия, чтобы сопоставить их с соответствующими свойствами
Маршрут должен быть сопоставлен со значением: Rue de Dunkerque & streetNumber должно быть равно 36.
О, я понял. В этом случае вы должны использовать свой собственный Transform
. Я бы так сделал:
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)
}
}
Совет: используйте 3 обратных кавычки (`), чтобы создать блок кода в уценке.func doSomething() { }
func doSomething() {
}
Или вы можете использовать ``тег, если вы хотите выделить где-нибудь жирный текст.<pre> func <strong>doSomething</strong>() { } </pre>
func doSomething () { }
Хорошо, вот что я подумал, спасибо за это чистое решение, человек, очень полезный!
Самый полезный комментарий
Хорошо, вот что я подумал, спасибо за это чистое решение, человек, очень полезный!