对 GMSCoordinateBounds 数组的 Swift 解码 JSON 响应

Posted

技术标签:

【中文标题】对 GMSCoordinateBounds 数组的 Swift 解码 JSON 响应【英文标题】:Swift Decode JSON Response to GMSCoordinateBounds Array 【发布时间】:2021-09-24 12:14:14 【问题描述】:

在我的应用中,我有以下 JSON 响应和代表活动工作区域的结构

JSON:


    "status_code": 1000,
    "data": [
        
        
            "name": "BWME23DW",
            "north_east_lat": 33.34534,
            "north_east_lng": 44.56467
            "south_west_lat": 34.89434,
            "south_west_lng": 44.54567

        ,
    ],
    "message": null

结构:

import Foundation
import CoreLocation
import GoogleMaps

struct ActiveBounds : Codable 
    
    var status_code : Int!
    var data : [LatLngBounds]!
    var message : String!


struct LatLngBounds : Codable
    
    var name : String!
    var north_east_lat : CLLocationDegrees!
    var north_east_lng : CLLocationDegrees!
    var south_west_lat : CLLocationDegrees!
    var south_west_lng : CLLocationDegrees!
    
    enum CodingKeys: String, CodingKey 
        
        case name
        case north_east_lat
        case north_east_lng
        case south_west_lat
        case south_west_lng
    
    

解码响应后,我需要检查用户当前位置是否在活动范围内,这很容易使用GMSCoordinateBounds.contains(latLong) 那么我如何直接在我的 ActiveBounds 结构中解码和初始化它,以将数据属性作为 GMSCoordinateBounds 数组而不是 LatLngBounds 结构返回

这就是我想要完成的事情

import Foundation
import CoreLocation
import GoogleMaps

struct ActiveBounds : Codable 
    
    var status_code : Int!
    var data : [GMSCoordinateBounds]!
    var message : String!

【问题讨论】:

GMSCoordinateBounds 是从 2 个坐标创建一个矩形,不是吗?只有1个坐标怎么能初始化?但我建议您在 ActiveBounds 上创建一个计算变量,将 [LatLngBounds] 转换为 [GMSCoordinateBounds] 对不起,我复制了错误的代码,我更新它 您真的需要将它放在变量data 中吗?或者它可以是另一个属性?因为目前,GMSCoordinateBounds 也需要是 Codable。如果您不使用它,但只能在您的模型中使用... 我会为 GMSCoordinateBounds 属性使用单独的模型,而不是更改或扩展您的 json 相关结构,如果您想添加新的属性/功能,我认为这将是一个更简洁的解决方案并且更容易修改。另外,一旦 json 被正确解码,你真的关心那个状态码和(错误?)消息吗? @Larme 可以在另一个属性中,我只想将它作为数组访问以在我的控制器中循环以检查当前位置是否在活动区域​​之一内 【参考方案1】:

无需在属性末尾写!...

更简单的方法是在ActiveBounds 上创建一个惰性变量或计算属性,它将[LatLngBounds] 转换为[GMSCoordinateBounds]

struct ActiveBounds : Codable 

    var status_code : Int
    var data: [LatLngBounds]
    var message: String

    lazy var coordinatesBounds: [GMSCoordinateBounds] = 
        data.map  GMSCoordinateBounds(coordinate: CLLocationCoordinate2D(latitude: $0.north_east_lat, 
                                                                          longitude: $0.north_east_lng),
                                       coordinate: CLLocationCoordinate2D(latitude: $0.south_west_lat, 
                                                                          longitude: $0.south_west_lng) 
    ()

这样,您就不会“更改”需要自定义 init(from decoder:) 的 JSON 模型。

【讨论】:

以上是关于对 GMSCoordinateBounds 数组的 Swift 解码 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

GMSCoordinateBounds 包括坐标在 Google Maps SDK for iOS 中无法正常工作

MKMapView 边界

在谷歌地图可见区域中拟合两个地理定位点

js如何对下面数组进行排序?

剑指offer——数组的逆序对

PHP数组排序