CoreLocation 的 Codable 扩展 类
Codable extension to CoreLocation classes
我需要将 Codable
添加到两个 class。一个是 CLLocationCoordinate2D
,第二个是 CLCircularRegion
。
我对 CLLocationCoordinate2D
没有意见,这样做是可行的:
extension CLLocationCoordinate2D: Codable {
public enum CodingKeys: String, CodingKey {
case latitude
case longitude
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(latitude, forKey: .latitude)
try container.encode(longitude, forKey: .longitude)
}
public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
latitude = try values.decode(Double.self, forKey: .latitude)
longitude = try values.decode(Double.self, forKey: .longitude)
}
}
但是我在尝试用 CLCircularRegion
做同样的事情时遇到了很多问题。由于 radius
和 center
是只读属性,我无法真正以相同的方式创建它们。另一个问题是为什么我能够在 CLLocationCoordinate2D
中创建 public init
并在 CLCircularRegion
中创建 Codable
扩展我收到错误:
我明白了 public 的要点,但这是必需的吗?当然 required
会失败,因为它是扩展名而不是 class。因此,针对此问题的一种解决方案是创建抽象 class,它将包含所有字段并在初始化程序中构建区域,我知道,但是还有其他方法可以将 Codable
扩展到现有的 class Apple 还不支持吗?
我将 CLCircularRegion 移动到计算变量,它现在自动与 Codable 一起工作:
var region: CLCircularRegion { return CLCircularRegion(center: self.coordinates, radius: 10.0, identifier: identifier) }
受到 的启发,我通过以 Double
格式存储在对象中的纬度和经度解决了我的问题。
CLLocation
然后作为计算 属性 返回,读取两个存储值:
private var latitude: Double = 0.0
private var longitude: Double = 0.0
var location: CLLocation {
return CLLocation(latitude: latitude, longitude: longitude)
}
对于 CLCircularRegion
的情况,您还需要以类似的方式保存 radius
和 center
。
我需要将 Codable
添加到两个 class。一个是 CLLocationCoordinate2D
,第二个是 CLCircularRegion
。
我对 CLLocationCoordinate2D
没有意见,这样做是可行的:
extension CLLocationCoordinate2D: Codable {
public enum CodingKeys: String, CodingKey {
case latitude
case longitude
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(latitude, forKey: .latitude)
try container.encode(longitude, forKey: .longitude)
}
public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
latitude = try values.decode(Double.self, forKey: .latitude)
longitude = try values.decode(Double.self, forKey: .longitude)
}
}
但是我在尝试用 CLCircularRegion
做同样的事情时遇到了很多问题。由于 radius
和 center
是只读属性,我无法真正以相同的方式创建它们。另一个问题是为什么我能够在 CLLocationCoordinate2D
中创建 public init
并在 CLCircularRegion
中创建 Codable
扩展我收到错误:
我明白了 public 的要点,但这是必需的吗?当然 required
会失败,因为它是扩展名而不是 class。因此,针对此问题的一种解决方案是创建抽象 class,它将包含所有字段并在初始化程序中构建区域,我知道,但是还有其他方法可以将 Codable
扩展到现有的 class Apple 还不支持吗?
我将 CLCircularRegion 移动到计算变量,它现在自动与 Codable 一起工作:
var region: CLCircularRegion { return CLCircularRegion(center: self.coordinates, radius: 10.0, identifier: identifier) }
受到 Double
格式存储在对象中的纬度和经度解决了我的问题。
CLLocation
然后作为计算 属性 返回,读取两个存储值:
private var latitude: Double = 0.0
private var longitude: Double = 0.0
var location: CLLocation {
return CLLocation(latitude: latitude, longitude: longitude)
}
对于 CLCircularRegion
的情况,您还需要以类似的方式保存 radius
和 center
。