Swift 5.9 [平台](https://www.apple.com/ios/ios-15/) Swift Package Index Swift Package Manager License

CLLocation+Codable

愿景

一个易于使用的 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)'")
}

以及如何解码它?

非常简单,但不要忘记解包。因为您实际上是在解码包装器,所以您必须使用您解码的 CLLocationWrapperlocation 属性

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 Package Manager 是一个用于自动化 Swift 代码分发的工具,并集成到 swift 编译器中。

一旦您设置了 Swift 包,将 CLLocationWrapper 添加为依赖项就像将其添加到 Package.swiftdependencies 值中一样简单。

dependencies: [
    .package(url: "https://github.com/visskiss/CLLocation-Codable")
]

手动

如果您不想使用任何上述依赖管理器,您可以手动将 CLLocationWrapper 集成到您的项目中。

贡献

您可以通过添加新功能、澄清当前代码或修复错误来做出贡献。为此,请打开一个 PR。当提交拉取请求时,请添加测试并确保您的更改不会破坏任何现有测试。

鸣谢

此仓库的灵感来自这个