[平台](https://www.apple.com/ios/ios-15/)
一个易于使用的 CLLocation 包装器,用于编码和解码 CLLocation 和 CLLocationCoordinate2D。
许多 iOS 应用程序都使用 Core Location 框架。Core Location 的主要对象是 CLLocation,它表示一个位置。出于某些奇怪的原因,Core Location 不符合 Codable 协议。因此,我们默认情况下无法序列化它,将其保存到数据库,或通过网络 API 发送它。这个项目解决了这个问题。
在这段代码中,我为 CLLocation 创建了一个包装器,您可以使用它来序列化和反序列化 CLLocation。尽情享用吧!
附注:查看测试以了解其工作原理以及如何使用 CLLocationWrapper。
假设您有一个位置
import CoreLocation
let location = CLLocation(coordinate: CLLocationCoordinate2D(latitude: 16.6, longitude: 12.5),
altitude: 2.6,
horizontalAccuracy: 1.8,
verticalAccuracy: 9,
course: 46.891,
speed: 1.5,
timestamp: Date())
您现在可以直接序列化它,例如
class MyClass:Encodable {
var location:CLLocation
}
瞧!它被序列化了!
现在您可以将其发送到服务器,将其保存在用户默认设置中,或将其写入数据库
let jsonEncoder = JSONEncoder()
do {
let encodedLocation = try jsonEncoder.encode(location)
// Do whatever you want with the location
} catch {
print("Error! Location encode failed: '\(error)'")
}
以及如何解码它?
非常简单,但不要忘记解包。因为您实际上是在解码包装器,所以您必须使用您解码的 CLLocationWrapper
的 location
属性
let jsonDecoder = JSONDecoder()
do {
// decode the CLLocationWrapper
let decodedLocationWrapper = try jsonDecoder.decode(CLLocationWrapper.self, from: encodedLocation)
// use the location property to create the location
let location = decodedLocationWrapper.location
// Do whatever you want with the wrapped location
} catch {
print("Error! Location wrapper decode failed: '\(error)'")
}
Swift Package Manager 是一个用于自动化 Swift 代码分发的工具,并集成到 swift
编译器中。
一旦您设置了 Swift 包,将 CLLocationWrapper 添加为依赖项就像将其添加到 Package.swift
的 dependencies
值中一样简单。
dependencies: [
.package(url: "https://github.com/visskiss/CLLocation-Codable")
]
如果您不想使用任何上述依赖管理器,您可以手动将 CLLocationWrapper 集成到您的项目中。
您可以通过添加新功能、澄清当前代码或修复错误来做出贡献。为此,请打开一个 PR。当提交拉取请求时,请添加测试并确保您的更改不会破坏任何现有测试。
此仓库的灵感来自这个包