gpt4 book ai didi

arrays - 使用 Struct 的 Encodable 协议(protocol)解码 2D 多边形坐标

转载 作者:行者123 更新时间:2023-11-30 11:06:09 25 4
gpt4 key购买 nike

我正在尝试使用 Swift Struct 的 Encodable 协议(protocol)解析下面的 json。如果我设置 AnyAnyObject 的坐标,则会给出错误,指出不符合协议(protocol)。

我知道这可以使用数组和字典来实现,但我不想那样做。

{
"coordinates": [
[
[
0.148271,
51.6723432
],
[
0.148271,
51.3849401
],
[
-0.3514683,
51.3849401
],
[
-0.3514683,
51.6723432
],
[
0.148271,
51.6723432
]
]
]
}

struct Geometry: Codable {
let coordinates: [[[Double]]]

init(from decoder: Decoder) throws {
let data = try decoder.container(keyedBy: CodingKeys.self)
coordinates = try data.decode([[[Double]]].self, forKey: .coordinates)
}
}

do {
let decoded = try JSONDecoder().decode(Geometry.self, from: data!)
print(decoded)
completionHandler(statusCode, decoded)
} catch {
print("Failed to encode data.")
completionHandler(statusCode, nil)
}

如何解决这个问题?

最佳答案

我的建议是使CLLocationCooperative2D符合Codable解码Double的数组

import CoreLocation

extension CLLocationCoordinate2D : Codable {
public init(from decoder: Decoder) throws {
var arrayContainer = try decoder.unkeyedContainer()
if arrayContainer.count == 2 {
let lat = try arrayContainer.decode(CLLocationDegrees.self)
let lng = try arrayContainer.decode(CLLocationDegrees.self)
self.init(latitude: lat, longitude: lng)
} else {
throw DecodingError.dataCorruptedError(in: arrayContainer, debugDescription: "Coordinate array must contain two items")
}
}

public func encode(to encoder: Encoder) throws {
var arrayContainer = encoder.unkeyedContainer()
try arrayContainer.encode(contentsOf: [latitude, longitude])
}
}

然后你可以简单地声明Geometry

struct Geometry: Codable {
let coordinates: [[CLLocationCoordinate2D]]
}

关于arrays - 使用 Struct 的 Encodable 协议(protocol)解码 2D 多边形坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52701857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com